Sigrid Solveig Haflínudóttirfix command line parsing3f1e7b73 years agoHistory
201 lines · 3.6 KB · C
RawDownload
#include "all.h"#include "config.h"#include "parg.h" Target T; char debug['Z'+1] = {	['P'] = 0, /* parsing */	['M'] = 0, /* memory optimization */	['N'] = 0, /* ssa construction */	['C'] = 0, /* copy elimination */	['F'] = 0, /* constant folding */	['A'] = 0, /* abi lowering */	['I'] = 0, /* instruction selection */	['L'] = 0, /* liveness */	['S'] = 0, /* spilling */	['R'] = 0, /* reg. allocation */}; extern Target T_amd64_sysv;extern Target T_amd64_apple;extern Target T_arm64;extern Target T_arm64_apple;extern Target T_rv64; static Target *tlist[] = {	&T_amd64_sysv,	&T_amd64_apple,	&T_arm64,	&T_arm64_apple,	&T_rv64,	0};static FILE *outf;static int dbg; static voiddata(Dat *d){	if (dbg)		return;	emitdat(d, outf);	if (d->type == DEnd) {		fputs("/* end data */\n\n", outf);		freeall();	}} static voidfunc(Fn *fn){	uint n; 	if (dbg)		fprintf(stderr, "**** Function %s ****", fn->name);	if (debug['P']) {		fprintf(stderr, "\n> After parsing:\n");		printfn(fn, stderr);	}	T.abi0(fn);	fillrpo(fn);	fillpreds(fn);	filluse(fn);	promote(fn);	filluse(fn);	ssa(fn);	filluse(fn);	ssacheck(fn);	fillalias(fn);	loadopt(fn);	filluse(fn);	fillalias(fn);	coalesce(fn);	filluse(fn);	ssacheck(fn);	copy(fn);	filluse(fn);	fold(fn);	T.abi1(fn);	simpl(fn);	fillpreds(fn);	filluse(fn);	T.isel(fn);	fillrpo(fn);	filllive(fn);	fillloop(fn);	fillcost(fn);	spill(fn);	rega(fn);	fillrpo(fn);	simpljmp(fn);	fillpreds(fn);	fillrpo(fn);	assert(fn->rpo[0] == fn->start);	for (n=0;; n++)		if (n == fn->nblk-1) {			fn->rpo[n]->link = 0;			break;		} else			fn->rpo[n]->link = fn->rpo[n+1];	if (!dbg) {		T.emitfn(fn, outf);		fprintf(outf, "/* end function %s */\n\n", fn->name);	} else		fprintf(stderr, "\n");	freeall();} #ifdef __plan9__void#elseint#endifmain(int ac, char *av[]){	Target **t;	FILE *inf, *hf;	char *f, *sep;	int c, optend;	struct parg_state ps; 	parg_init(&ps); 	T = Deftgt;	outf = stdout;	optend = parg_reorder(ac, av, "hd:o:t:", NULL);	while ((c = parg_getopt(&ps, optend, av, "hd:o:t:")) != -1)		switch (c) {		case 1:			print("! %s\n", ps.optarg);			break;		case 'd':			if (isalpha(*ps.optarg)) {				debug[toupper(*ps.optarg)] = 1;				dbg = 1;			}			break;		case 'o':			if (strcmp(ps.optarg, "-") != 0) {				outf = fopen(ps.optarg, "w");				if (!outf) {					fprintf(stderr, "cannot open '%s'\n", ps.optarg);					exit(1);				}			}			break;		case 't':			if (strcmp(ps.optarg, "?") == 0) {				puts(T.name);				exit(0);			}			for (t=tlist;; t++) {				if (!*t) {					fprintf(stderr, "unknown target '%s'\n", ps.optarg);					exit(1);				}				if (strcmp(ps.optarg, (*t)->name) == 0) {					T = **t;					break;				}			}			break;		case 'h':		default:			hf = c != 'h' ? stderr : stdout;			fprintf(hf, "%s [OPTIONS] {file.ssa, -}\n", av[0]);			fprintf(hf, "\t%-11s prints this help\n", "-h");			fprintf(hf, "\t%-11s output to file\n", "-o file");			fprintf(hf, "\t%-11s generate for a target among:\n", "-t <target>");			fprintf(hf, "\t%-11s ", "");			for (t=tlist, sep=""; *t; t++, sep=", ") {				fprintf(hf, "%s%s", sep, (*t)->name);				if (*t == &Deftgt)					fputs(" (default)", hf);			}			fprintf(hf, "\n");			fprintf(hf, "\t%-11s dump debug information\n", "-d <flags>");			exit(c != 'h');		} 	do {		f = av[optend];		if (!f || strcmp(f, "-") == 0) {			inf = stdin;			f = "-";		} else {			inf = fopen(f, "r");			if (!inf) {				fprintf(stderr, "cannot open '%s'\n", f);				exit(1);			}		}		parse(inf, f, data, func);		fclose(inf);	} while (++optend < ac); 	if (!dbg)		T.emitfin(outf); 	exit(0);}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t