⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 epi.c

📁 mips架构的bootloader,99左右的版本 但源代码现在没人更新了
💻 C
字号:
/************************************************************* * File: tools/epi.c * Purpose: compiler driver for pmcc command for EPI tools * Author: Phil Bunce (pjb@carmel.com) * Revision History: *	970304	Added -driver and -ice *	970307	Added dList/nList to fix -lmon probs *	970307	Turned off #173 warnings *	970313	mksyms modified to take 2 filenames *	970313	Added -ssyms option (separate symbols) *	970314	Removed $LSIPKG refs in crtn pathnames *	970417	Added check for nfiles==0 *	970902	Removed -ice option */#include <stdio.h>#include <malloc.h>#include <string.h>#include "../include/defines.h"#include "misc.h"#define DYNDEFS		/* support dynamic defines */#define PRAGMAS "-Hpragma='Offwarn(553)' -Hpragma='Offwarn(64)' \    -Hpragma='Offwarn(268)' -Hpragma='Offwarn(289)' -Hpragma='Offwarn(240)' \    -Hpragma='Offwarn(652)' -Hpragma='Offwarn(269)' -Hpragma='Offwarn(173)'"/* set various defaults */int vflag = 0;int fast = 1;int syms = 1;int ssyms_flag;char *chksum = "";char *ofile = "a";char LIBM[100] = "/usr/lib/cmplrs/cc";char cmdfile[] = "cmdfile";char cmdchar[] = "@";int crt0_flag;char tmp[LNMAX],tmp2[LNMAX];char *ENDIAN,*Gnum,*LSIPMCC;char *COMP_HOST_ROOT;Str flags,cflags,asflags,ldflags,ofiles,llist,ilist,rflags,files,LIBS,ppflags;Str *strlst[] = {&flags,&cflags,&asflags,&ldflags,&ofiles,&llist,&ilist, &ppflags,&rflags,&files,&LIBS,0};char *LSIPKG;char *LIBC, *crt0;char *initial_lc = "-lc";char objfile[100];char tstart[10];char *dstart;int nfiles;char stoppoint;int SZ;char *HCDIR;char *clientpc;int driver;char *dList[20];int nList;char *getDef();/**************************************************************  main(argc,argv)*/main(argc,argv)int argc;char *argv[];{int i,status,SZ,sz;char *p,*e,h[20],*vtmp,*fmt,*file;FILE *cfp;char tmp2[100];SZ = 0;if (! (LSIPKG=getenv("LSIPKG"))) {	fprintf(stderr,"pmcc: LSIPKG not set\n");	Exit(1);	}if (! (HCDIR=getenv("HCDIR"))) {	fprintf(stderr,"pmcc: HCDIR not set\n");	Exit(1);	}/* for backward compatability we set LSIPMCC */if (! (LSIPMCC=getenv("LSIPMCC"))) LSIPMCC = "";#ifdef DYNDEFSsprintf(tmp,"%s/include/defines.h",LSIPKG);readDefs(tmp);if (getDef("SREC")) fast = 0;if (clientpc=getDef("CLIENTPC")) strcpy(tstart,&clientpc[2]);else strcpy(tstart,"80020000");#else#ifdef SRECfast = 0;#endif#ifdef CLIENTPCsprintf(tstart,"%08lx",CLIENTPC);#elsestrcpy(tstart,"80020000");#endif#endif/* Select default Endianess. */#ifdef LENDEFENDIAN = "l";#elseENDIAN = "b";#endifGnum = "o";sprintf(tmp,"-I%s/include",LSIPKG);Strcpy(&ilist,tmp);sprintf(tmp,"-l %s/lib/%%s%%s/libc.a",LSIPKG);Strcpy(&llist,tmp);sprintf(tmp,"-DPMCC -DEPI %s",LSIPMCC);Strcpy(&flags,tmp);Strcpy(&cflags,"-w1");Strcpy(&asflags,"");getargs(argc,argv);if (strequ(ENDIAN,"l")) addarg(&flags,"-r");strcpy(objfile,ofile);if (strequ(ofile,"a")) strcpy(objfile,"a.out");if (stoppoint==0) {	addarg(&cflags,"-c"); /* never want the hc driver to call ld */	addarg(&ldflags,"-o");	addarg(&ldflags,objfile);	}else if (nfiles == 1) {	file = getStrn(&files,0);	e = extent(file);	getHead(h,file);	if (strequ(e,"c")) {		addarg(&cflags,"-o");		if (!strequ(ofile,"a")) addarg(&cflags,ofile);		else {			if (stoppoint == 'c') sprintf(tmp,"%s.o",h);			else sprintf(tmp,"%s.s",h);			addarg(&cflags,tmp);			}		}	else if (strequ(e,"s")) {		addarg(&asflags,"-o");		if (!strequ(ofile,"a")) addarg(&asflags,ofile);		else {			sprintf(tmp,"%s.o",h);			addarg(&asflags,tmp);			}		}	free(file);	}sprintf(tmp,llist.str,ENDIAN,Gnum,ENDIAN,Gnum);addarg(&ldflags,tmp);addarg(&flags,ilist.str);if (nfiles == 0) {	printf("Fatal error: no files specified.\n"); 	exit(1); 	} /* now invoke the compiler */for (i=0;i<nfiles;i++) {	file = getStrn(&files,i);	e = extent(file);	if (strequ(e,"s")) {		getRoot(tmp2,file);		fmt = "%s/bin/eas -s -I%s %s %s %s";		sz = strlen(HCDIR)+strlen(tmp2)+strlen(flags.str)+			strlen(asflags.str)+strlen(file)+strlen(fmt);		vtmp = malloc(sz);		sprintf(vtmp,fmt,HCDIR,tmp2,flags.str,asflags.str,file);		if (status=System(vtmp)) Exit(status);		Free(vtmp);		getHead(tmp,file);		strcat(tmp,".o");		addarg(&ofiles,tmp);		}	else if (strequ(e,"c")) {		fmt = "%s/bin/hc %s %s %s %s";		sz = strlen(HCDIR)+strlen(PRAGMAS)+strlen(flags.str)+			strlen(cflags.str)+strlen(file)+strlen(fmt);		vtmp = malloc(sz);		sprintf(vtmp,fmt,HCDIR,PRAGMAS,flags.str,cflags.str,file);		if (status=System(vtmp)) Exit(status);		Free(vtmp);		getHead(tmp,file);		strcat(tmp,".o");		addarg(&ofiles,tmp);		}	else if (strequ(e,"o")) {		addarg(&ofiles,file);		}	else if (strequ(e,"a")) {		addarg(&ofiles,file);		}	else {		fprintf(stderr,"%s: bad extent\n",e);		Exit(1);		}	free(file);	}if (stoppoint != 0) Exit(0);/* Select math library */if (SZ) {	sprintf(tmp,"%s/libm/%s/libm.a",LSIPKG,ENDIAN);	if (fileExists(tmp)) strcpy(LIBM,tmp);	}/* Select C library */fmt = "%s/lib/%s%s";sz = strlen(fmt)+strlen(LSIPKG)+strlen(ENDIAN)+strlen(Gnum);LIBC = malloc(sz);sprintf(LIBC,fmt,LSIPKG,ENDIAN,Gnum);if (!crt0) {	fmt = "%s/crt0.o";	crt0 = malloc(strlen(fmt)+strlen(LIBC));	sprintf(crt0,fmt,LIBC);	}if (dstart) {	sprintf(tmp,"%s.lk",objfile);	cfp = fopen(tmp,"w");	if (cfp == 0) {		fprintf(stderr,"can't open %s\n",tmp);		Exit(1);		}	fprintf(cfp,		"SECTIONS\n{\n\t.text ADDRESS 0x%s:\n\tGROUP ADDRESS 0x%s:\n",		tstart,dstart);	fprintf(cfp,"\t{\n\t\t.rdata ALIGN 8:\n\t\t.data ALIGN 8:\n");	fprintf(cfp,"\t\t.sdata ALIGN 8:\n\t\t.sbss ALIGN 8:\n");	fprintf(cfp,"\t\t.bss ALIGN 8:\n\t}\n}\n");	fclose(cfp);	}if (dstart) {	fmt = "%s/bin/eld %s.lk %s %s %s -t > %s.map";	sz = strlen(HCDIR)+strlen(ofile)+strlen(ldflags.str)+strlen(crt0)+		strlen(ofiles.str)+strlen(ofile)+strlen(fmt);	vtmp = malloc(sz);	sprintf(vtmp,fmt,HCDIR,ofile,ldflags.str,crt0,ofiles.str,ofile);	}else {	fmt = "%s/bin/eld -x0x%s %s %s %s -t > %s.map";	sz = strlen(HCDIR)+strlen(tstart)+strlen(ldflags.str)+strlen(crt0)+		strlen(ofiles.str)+strlen(ofile)+strlen(fmt);	vtmp = malloc(sz);	sprintf(vtmp,fmt,HCDIR,tstart,ldflags.str,crt0,ofiles.str,ofile);	}if (status=System(vtmp)) Exit(status);Free(vtmp);/* now make the appropriate download records */Strcpy(&rflags,"-h -m3");if (driver) {	fmt = "%s/bin/ft %s -o %s.tmp %s";	sz = strlen(HCDIR)+strlen(rflags.str)+strlen(ofile)+strlen(objfile)		+strlen(fmt);	vtmp = malloc(sz);	sprintf(vtmp,fmt,HCDIR,rflags.str,ofile,objfile);	if (vflag) fprintf(stderr,"%s\n",vtmp);	if (status=System(vtmp)) Exit(status);	Free(vtmp);	sprintf(tmp,"%s.rec",ofile);	sprintf(tmp2,"%s.tmp",ofile);	str2file(tmp,"SD");	appendFile(tmp,tmp2);	Exit(0);	}if (prom) addarg(&rflags,"-x rda=t");if (syms) {	fmt = "%s/bin/ft %s -o %s.tmp %s";	sz = strlen(HCDIR)+strlen(rflags.str)+strlen(ofile)+strlen(objfile)		+strlen(fmt);	vtmp = malloc(sz);	sprintf(vtmp,fmt,HCDIR,rflags.str,ofile,objfile);	if (status=System(vtmp)) Exit(status);	Free(vtmp);	sprintf(tmp,"%s.rec",ofile);	sprintf(tmp2,"%s.map",ofile);	mksyms(tmp2,tmp);	sprintf(tmp2,"%s.tmp",ofile);	appendFile(tmp,tmp2);	if (vflag) fprintf(stderr,"rm %s\n",tmp2);	unlink(tmp2);	}else {	fmt = "%s/bin/ft %s -o %s.rec %s";	sz = strlen(HCDIR)+strlen(rflags.str)+strlen(ofile)+strlen(objfile)		+strlen(fmt);	vtmp = malloc(sz);	sprintf(vtmp,fmt,HCDIR,rflags.str,ofile,objfile);	if (status=System(vtmp)) Exit(status);	Free(vtmp);	}if (fast) {	sprintf(tmp,"%s.tmp",ofile);	sprintf(tmp2,"%s.rec",ofile);	unlink(tmp);	rename(tmp2,tmp);	fmt = "%s/tools/rdsrec -f %s.tmp -o %s.rec";	sz = strlen(LSIPKG)+strlen(ofile)+strlen(ofile)+strlen(fmt);	vtmp = malloc(sz);	sprintf(vtmp,fmt,LSIPKG,ofile,ofile);	if (status=System(vtmp)) Exit(status);	Free(vtmp);	}if (ssyms_flag) {	sprintf(tmp,"%s.map",ofile);	sprintf(tmp2,"%s.sym",ofile);	mksyms(tmp,tmp2);	}Exit(0);}/**************************************************************  getargs(argc,argv)*/getargs(argc,argv)int argc;char *argv[];{int i,j,sz;char *p,*fmt;/*# This while loop does several jobs:# 	1. strips off any pmcc defined options# 	2. some options, if specified, must preceed path specs# 	   so extract them from here, and add them to flags.# 	3. find the output filename, if specified*/for (i=1;i < argc;i++) {	if (!strncmp(argv[i],"-l",2)) {		for (j=0;j<nList;j++) {			sprintf(tmp,"%s/lib%s.a",dList[j],&argv[i][2]);			if (fileExists(tmp)) {				addarg(&ldflags,"-l");				addarg(&ldflags,tmp);				}			}		}	else if (strequ(argv[i],"-G")) {		i++;		sprintf(tmp,"-G%s",argv[i]);		addarg(&flags,tmp);		if (strequ(argv[i],"0")) Gnum = "g";		else Gnum = "o";		}        else if (!strncmp(argv[i],"-D",2) && strlen(argv[i]) > 2) {                addarg(&flags,argv[i]);                }	else if (strequ(argv[i],"-float")) {		addarg(&flags,argv[i]);		addarg(&flags,"-DFLOAT");		SZ = 1;		}	else if (getStdArgs(argc,argv,&i)) ;	else if (argv[i][0] == '-') {		fprintf(stderr,"%s: bad arg\n",argv[i]);		exit(1);		}	else {		addarg(&files,argv[i]);		nfiles++;		}	}}/**************************************************************  mksyms(ifn,ofn)*/mksyms(ifn,ofn)char *ifn,*ofn;{FILE *ifp,*ofp;char buf[100],*field[10];int nf,flag,csum,len;if (vflag) fprintf(stderr,"mksyms %s > %s\n",ifn,ofn);flag = 0;ifp = fopen(ifn,"r");if (ifp == 0) {	fprintf(stderr,"Can't open %s\n",ifn);	Exit(1);	}ofp = fopen(ofn,"w");if (ofp == 0) {	fprintf(stderr,"Can't open %s\n",ofn);	Exit(1);	}for (;;) {	if (!fgets(buf,100,ifp)) break;	if (!strncmp(buf,"SYMBOL",6)) {		flag = 1;		continue;		}	if (!flag) continue;	nf = argvize(field,buf);	if (nf < 3 || nf > 4) continue;	csum = 0;	len = strlen(field[0])+8+2;	fprintf(ofp,"S4%02X%s%s,%02x\n",len,field[1],field[0],csum);	}fclose(ifp);fclose(ofp);}/**************************************************************  Exit(x)*/Exit(x)int x;{int i;for (i=0;strlst[i];i++) {	if (strlst[i]->str) free(strlst[i]->str);	}exit(((x)>127)?1:(x));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -