📄 epi.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 + -