Files
Arquivotheca.SunOS-4.1.4/lang/compile/setup_f77.c
seta75D ff309bfe1c Init
2021-10-11 18:37:13 -03:00

474 lines
10 KiB
C

#ifndef lint
static char sccsid[] = "@(#)setup_f77.c 1.1 94/10/31 SMI";
#endif
/*
* Copyright (c) 1987 by Sun Microsystems, Inc.
*/
#include "driver.h"
/*
* compile_f
*/
int
compile_f(source)
char *source;
{
int status;
#ifdef BROWSER
global_flag.code_browser = global_flag.code_browser_seen;
#endif
clear_program_options();
if ( (requested_suffix == &suffix.s) ||
(target_arch.value->value == ARCH_SUN386) )
{
set_flag(do_cat);
}
if (is_on(statement_count))
{
setup_tcov_file(source);
}
/* if this is version 1.2 and sw release 4.0
* then look for the assembler and c2 elsewhere
*/
if (check_release_version_driver(SW_REL_40,DRIVER_REL_12,DRIVER_F) )
{
program.as.path = "/usr/lib/f77/as";
program.asS.path = "/usr/lib/f77/as";
program.c2.path = "/usr/lib/f77/c2";
}
/* if the pic flag was specified on the command line, we need
* to turn it off, it is only valid for 1.2 and 4.0 OS
*/
else
{
if (is_on(PIC_code))
{
reset_flag(PIC_code);
warning("-PIC option ignored");
}
if (is_on(pic_code))
{
reset_flag(pic_code);
warning("-pic option ignored");
}
}
status= run_steps(source,
((optimizer_level > OPTIM_C2) ||
is_on(statement_count))
? f_iropt_steps : f_no_iropt_steps,
TRUE,
"f");
reset_flag(do_cat);
#ifdef BROWSER
reset_flag(code_browser);
#endif
return status;
} /* compile_f */
/*
* compile_F
*/
int
compile_F(source)
char *source;
{
int status;
set_flag(do_cpp);
status= compile_f(source);
reset_flag(do_cpp);
return status;
} /* compile_F */
/*
* compile_r
*/
int
compile_r(source)
char *source;
{
int status;
set_flag(do_ratfor);
status= compile_f(source);
reset_flag(do_ratfor);
return status;
} /* compile_r */
/*
* setup_f1
*/
char *
setup_f1()
{
if (!program.f1.has_been_initialized)
{
program.f1.has_been_initialized = TRUE;
f1_to_mf1_copy();
if (profile.touched)
{
append_list(&program.f1.permanent_options, "-p");
}
if (is_on(checkC) || is_on(checkH) || is_on(checkV))
{
append_list(&program.f1.permanent_options, "-V");
}
switch (target_arch.value->value)
{
case ARCH_SUN2:
case ARCH_SUN3X:
case ARCH_SUN3:
append_list(&program.f1.permanent_options,
float_mode.value->name);
append_list(&program.f1.permanent_options,
get_processor_flag(target_arch.value));
break;
default:
/* do nothing. */
break;
}
}
return NULL;
} /* setup_f1 */
/*
* setup_f77pass1
*/
/*ARGSUSED*/
char *
setup_f77pass1(source, file)
char *source;
char *file;
{
char buffer[LOCAL_STRING_LENGTH];
if (!program.f77pass1.has_been_initialized)
{
program.f77pass1.has_been_initialized = TRUE;
if (optimizer_level > OPTIM_C2)
append_list(&program.f77pass1.permanent_options, "-O");
if (is_on(statement_count))
append_list(&program.f77pass1.permanent_options, "-a");
if (is_on(onetrip))
append_list(&program.f77pass1.permanent_options, "-1");
if (float_mode.value == &fsky)
append_list(&program.f77pass1.permanent_options, "-F");
if (debugger.value == &dbx)
append_list(&program.f77pass1.permanent_options, "-g");
if ( is_on(handle_misalignment) )
append_list(&program.f77pass1.permanent_options, "-m");
if ( (target_sw_release[R_PASSES].value->value >= SW_REL_41 )
||
/* if 4.0 OS and 1.2 fortran */
check_release_version_driver(SW_REL_40,DRIVER_REL_12,DRIVER_F) )
{
if ( is_on(doubleword_aligned_doubles) )
{
append_list(&program.f77pass1.permanent_options, "-f");
}
}
if ( (optimizer_level < OPTIM_IROPT_P) &&
is_off(statement_count) )
{
strcpy(buffer, "-P");
if (is_on(pic_code))
strcat(buffer, " -k");
if (is_on(PIC_code))
strcat(buffer, " -K");
if (profile.touched)
{
if ( (target_sw_release[R_PASSES].value->value
== SW_REL_3X) &&
(target_arch.value->value != ARCH_SUN4C) &&
(target_arch.value->value != ARCH_SUN4)
)
{
/* In release 3.x (for Sun-2 and Sun-3),
* -p was passed directly to the
* f77pass1 front-end.
*/
append_list(&program.f77pass1.permanent_options,
"-p");
}
else
{
/* In release 4.x (and in 3.x on Sun4),
* -p is passed to the f77pass1
* back-end via "-P -p".
*/
strcat(buffer, " -p");
}
}
switch (target_arch.value->value)
{
case ARCH_SUN2:
case ARCH_SUN3X:
case ARCH_SUN3:
strcat(buffer, " ");
strcat(buffer,
get_processor_flag(target_arch.value));
strcat(buffer, " ");
strcat(buffer, float_mode.value->name);
break;
case ARCH_SUN4C:
case ARCH_SUN4:
if ( (target_sw_release[R_PASSES].value->value
>= SW_REL_41 )
||
/* if 4.0 OS and 1.2 fortran */
check_release_version_driver(SW_REL_40,DRIVER_REL_12,DRIVER_F) )
{
if ( is_on(doubleword_aligned_doubles) )
{
strcat(buffer, " -d");
}
}
if ( is_on(handle_misalignment) )
{
strcat(buffer, " -m");
}
break;
case ARCH_FOREIGN:
/* foreign arch'ture: let them set their own. */
break;
default:
/* nothing to do. */
break;
}
if ( !STR_EQUAL(buffer, "-P") )
{
/* buffer contains more than just "-P". */
append_list(&program.f77pass1.permanent_options,
make_string(buffer));
}
else
if (target_arch.value->value == ARCH_SUN386)
{
append_list(&program.f77pass1.permanent_options, make_string(buffer));
}
}
}
/* When the original source file had a ".F" suffix, pass an extra
* argument to f77pass1: "-Efile.F".
* [This was done in f77's old dedicated driver (SunOS 3.0 and earlier).
* It disappeared when /lib/compile was created, and was missing in
* SunOS releases 3.2 thru 4.0beta2, and Sun FORTRAN releases up thru
* at least 1.05].
*/
if (target_arch.value->value != ARCH_SUN386)
{
if (STR_EQUAL("F", get_file_suffix(source)))
{
strcpy(buffer, "-E");
strcat(buffer, source);
append_list(&program.f77pass1.options, make_string(buffer));
}
}
#ifdef BROWSER
if (is_on(code_browser))
{
append_list(&program.f77pass1.options, "-cb");
}
#endif
append_list(&program.f77pass1.infile, file);
/* Since f77pass1 produces three outfiles we need some extra temps */
iropt_files[0]= temp_file_name(&program.f77pass1, &suffix.s, 's');
iropt_files[1]= temp_file_name(&program.f77pass1, &suffix.s, 'i');
iropt_files[2]= temp_file_name(&program.f77pass1, &suffix.s, 'd');
append_list(&program.f77pass1.infile, iropt_files[0]);
append_list(&program.f77pass1.infile, iropt_files[1]);
append_list(&program.f77pass1.infile, iropt_files[2]);
return iropt_files[1];
} /* setup_f77pass1 */
/*
* setup_cat_for_f77
* Used for "-S -O3 foo.f" when we need to collect several
* assembly sources.
*/
char *
setup_cat_for_f77(source, file)
char *source;
char *file;
{
if ((requested_suffix != &suffix.s) && (target_arch.value == &arch_sun386))
{
append_list(&program.cat.infile, iropt_files[0]);
append_list(&program.cat.infile, file);
append_list(&program.cat.infile, iropt_files[2]);
return program.cat.outfile= to_as_file = temp_file_name(&program.as, &suffix.s,0);
}
else
{
append_list(&program.cat.infile, iropt_files[0]);
append_list(&program.cat.infile, file);
append_list(&program.cat.infile, iropt_files[2]);
}
if (target_arch.value->value == ARCH_SUN386)
{
if (optim_after_cat)
{
return program.cat.outfile = temp_file_name(&program.as, &suffix.s,0);
}
else
{
return program.cat.outfile = outfile_name(source, &suffix.s, (ProgramP)NULL);
}
}
else
{
return program.cat.outfile = outfile_name(source, &suffix.s, (ProgramP)NULL);
}
} /* setup_cat_for_f77 */
static int as_use_c2_output = FALSE;
/*
* setup_c2_for_f77
* For the 386 if c2 is called then we must let the
* assembler know that to_as_file should not be used, but the
* output from c2 should be.
*/
char *
setup_c2_for_f77(source, file)
char *source;
char *file;
{
as_use_c2_output = TRUE;
return NULL;
}
/*
* setup_as_for_f77
* Used when "-O3 foo.f" means that as should be fed a number of
* assembly source files.
*
* Also used for sun386 .. whose "as" does not take more than
* one input file.
*
*/
char *
setup_as_for_f77(source, file)
char *source;
char *file;
{
(void)setup_as();
if (target_arch.value->value == ARCH_SUN386)
{
if (as_use_c2_output)
append_list(&program.as.infile, file);
else
append_list(&program.as.infile, to_as_file);
as_use_c2_output = FALSE;
}
else
{
append_list(&program.as.infile, iropt_files[0]);
append_list(&program.as.infile, file);
append_list(&program.as.infile, iropt_files[2]);
}
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_f77 */
/*
* setup_asS_for_f77
* Used when "-O3 foo.f" means that "as" should be fed a number of
* assembly source files. (SPARC version)
*/
char *
setup_asS_for_f77(source, file)
char *source;
char *file;
{
setup_asS();
append_list(&program.asS.infile, iropt_files[0]);
append_list(&program.asS.infile, file);
append_list(&program.asS.infile, iropt_files[2]);
program.asS.outfile= outfile_name(source, &suffix.s, (ProgramP)NULL);
return program.asS.outfile;
} /* setup_asS_for_f77 */
/*
* setup_ld_for_f77
*/
char *
setup_ld_for_f77()
{
register ListP p;
char buffer[LOCAL_STRING_LENGTH];
#ifdef sun386
static char *minus_u_options[] = { "-u", "MAIN_", NULL };
#else
static char *minus_u_options[] = { "-u", "_MAIN_", NULL };
#endif
static char *libraries[] =
{ "-lF77", "-lI77", "-lU77", "-lm",
"-lc", NULL };
static char *profiled_libraries[] =
{ "-lF77_p", "-lI77_p", "-lU77_p", "-lm_p",
"-lc_p", NULL };
#ifdef sun386
append_list(&program.ld.permanent_options, "-Bstatic");
#endif sun386
setup_ld( (driver.value == &f77) ? minus_u_options : (char **)NULL,
libraries, profiled_libraries );
return "";
}
/*
* f77_doit
*/
void
f77_doit()
{
set_requested_suffix(&suffix.f);
do_infiles();
if (!exit_status && (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("", link_steps, FALSE, "");
if (exit_status != 0)
{
do_not_unlink_ld_infiles();
}
}
} /* f77_doit */