ack/util/ego/share/go.c
2015-06-24 23:41:45 +01:00

159 lines
3.1 KiB
C

/* $Id$ */
/*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*/
/* S H A R E D F I L E
*
* G O . C
*
*/
#include <stdio.h>
#include "types.h"
#include "debug.h"
#include "global.h"
#include "files.h"
#include "get.h"
#include "put.h"
#include "lset.h"
#include "map.h"
#include "alloc.h"
#include "go.h"
static bool report_flag = FALSE; /* report #optimizations found? */
#ifdef DEBUG
static bool core_flag = FALSE; /* report core usage? */
#endif
static void mach_init(char *machfile, int (*phase_machinit)(void *))
{
/* Read target machine dependent information */
FILE *f;
f = openfile(machfile,"r");
fscanf(f,"%d",&ws);
fscanf(f,"%d",&ps);
if (ws != ps && ps != 2*ws) error("illegal pointer size");
(*phase_machinit)(f);
fclose(f);
}
void go(int argc, char *argv[], int (*initialize)(void *),
int (*optimize)(void *), int (*phase_machinit)(void *),
int (*proc_flag)(void *))
{
FILE *f, *gf, *f2, *gf2; /* The EM input and output and
* the basic block graphs input and output
*/
bblock_p g;
line_p l;
short kind;
int i;
char *p;
bool time_opt = TRUE;
linecount = 0;
for (i = ARGSTART; i < argc; i++) {
p = argv[i];
if (*p++ != '-') error("illegal argument");
switch(*p) {
case 'S':
time_opt = FALSE;
break;
case 'T':
time_opt = TRUE;
break;
case 'M':
p++;
mach_init(p,phase_machinit);
break;
case 'C':
#ifdef DEBUG
core_flag = TRUE;
#endif
break;
case 'Q':
report_flag = TRUE;
break;
case 'V':
verbose_flag = TRUE;
break;
default:
(*proc_flag)(p);
break;
}
}
time_space_ratio = (time_opt ? 100 : 0);
fproc = getptable(&pname); /* proc table */
fdblock = getdtable(&dname); /* data block table */
(*initialize)(NULL);
if (optimize == no_action) return;
f = openfile(lname,"r");
gf = openfile(bname,"r");
f2 = openfile(lname2,"w");
gf2 = openfile(bname2,"w");
mesregs = Lempty_set();
while (getunit(gf,f,&kind,&g,&l,&curproc,TRUE)) {
/* Read the control flow graph and EM text of
* one procedure and optimize it.
*/
if (kind == LDATA) {
putunit(LDATA, (proc_p) 0, l, gf2, f2);
continue;
}
OUTTRACE("flow graph of proc %d read",curproc->p_id);
curproc->p_start = g;
/* The global variable curproc points to the
* current procedure. It is set by getgraph
*/
(*optimize)(curproc);
putunit(LTEXT,curproc,(line_p) 0,gf2,f2);
/* output control flow graph + text */
OUTTRACE("graph of proc %d outputted",curproc->p_id);
Ldeleteset(mesregs);
mesregs = Lempty_set();
}
fclose(f);
fclose(f2);
fclose(gf);
fclose(gf2);
f = openfile(dname2,"w");
putdtable(fdblock,f);
/* fclose(f); done by putdtable */
f = openfile(pname2,"w");
putptable(fproc,f,TRUE);
/* fclose(f); done by putptable */
core_usage();
}
int no_action(void *dummy)
{
return 0;
}
void core_usage()
{
#ifdef DEBUG
if (core_flag) {
coreusage();
}
#endif
}
void report(char *s, int n)
{
/* Report number of optimizations found, if report_flag is set */
if (report_flag) {
fprintf(stderr,"%s: %d\n",s,n);
}
}