📄 probe_comp.c
字号:
if (ptrbits == 64 || !ptrbits) strcat(cmnd, " -64"); else strcat(cmnd, " -32"); for (i=0; i < NCOMP; i++) { if (CompIsMIPSpro(usrcomps[i])) { usrcomps[i+NCOMP] = NewAppendedString(usrcomps[i+NCOMP], cmnd); } } free(sp); }} /* end of routine GetComps */void TestComps(enum OSTYPE OS, enum MACHTYPE arch, int verb, char *targ, char *targarg, char **comps, enum F2CNAME *f2cnam, enum F2CINT *f2cint, enum F2CSTRING *f2cstr, int nof77)/* * This file tests that all C compilers work and interact w/o any changes, * and figure out how to have the fortran compiler call the C compiler */{ char cmnd[2048], res[1024]; char *sp; int i, ierr; if (verb) fprintf(stdout, "C compiler interoperation probe unimplemented!\n\n");/* * C interoperation checks */ if (verb > 1) fprintf(stderr, "ICC interoperation tests:\n"); for (i=0; i < NCOMP; i++) { if (i != XCC_ && i != F77_ && i != ICC_) { if (strcmp(comps[i], comps[ICC_])) /* only check if different */ { sprintf(cmnd, "make IRunC2C CC='%s' CCFLAGS='%s' CC1='%s' CC1FLAGS='%s' | fgrep SUCCESS", comps[ICC_], comps[NCOMP+ICC_], comps[i], comps[i+NCOMP]); if (verb > 1) fprintf(stderr, "cmnd='%s'\n", cmnd); ierr = CmndOneLine(NULL, cmnd, res); if (!ierr) ierr = !strstr(res, "SUCCESS"); if (ierr) { fprintf(stderr, "Compiler %d (%s) does not interoperate with interface compiler (%s), aborting!\n", i, comps[i], comps[ICC_]); fprintf(stderr, "ierr=%d, res='%s'\n", ierr, res); exit(ierr); } if (verb > 1) fprintf(stderr, " C2C %s/%s -- SUCCESS\n", comps[ICC_], comps[i]); } } }/* * F2c tests */ if (nof77) { *f2cnam = f2c_NamErr; *f2cint = f2c_IntErr; *f2cstr = f2c_StrErr; } else { sprintf(cmnd, "make IRun_f2c args=\"%s -C ic '%s' -F ic '%s' -C if '%s' -F if '%s'\" | fgrep 'F2C=('", targarg, comps[ICC_], comps[ICC_+NCOMP], comps[F77_], comps[F77_+NCOMP]); *f2cnam = f2c_NamErr; *f2cint = f2c_IntErr; *f2cstr = f2c_StrErr; if (verb > 1) fprintf(stderr, "cmnd='%s'\n", cmnd); if (!CmndOneLine(NULL, cmnd, res)) { if (verb > 1) fprintf(stderr, "res='%s'\n", res); i = sscanf(res, " F2C=(%d,%d,%d)", f2cnam, f2cint, f2cstr); if (verb > 1) fprintf(stderr, "nread=%d, f2cname=%d, f2cint=%d, f2cstr=%d\n", i, *f2cnam, *f2cint, *f2cstr); if (i != 3) *f2cnam = *f2cint = *f2cstr = 0; } if (verb) { printf("F2C name = %s\n", f2c_namestr[*f2cnam]); printf("F2C int = %s\n", f2c_intstr[*f2cint]); printf("F2C str = %s\n", f2c_strstr[*f2cstr]); } }}void PrintCompResults(char *file, char **comps, enum F2CNAME f2cnam, enum F2CINT f2cint, enum F2CSTRING f2cstr){ FILE *fpout; int i; if (file) fpout = fopen(file, "w"); else fpout = stdout; assert(fpout); for (i=0; i < NCOMP; i++) { if (comps[i]) fprintf(fpout, "%d '%s' '%s'\n", i, comps[i], comps[i+NCOMP]); } if (comps[F77_]) fprintf(fpout, "F2CNAME,F2CINT,F2CSTRING=(%d,%d,%d)\n", f2cnam, f2cint, f2cstr); if (fpout != stdout && fpout != stderr) fclose(fpout);}void PrintUsage(char *name, int iarg, char *arg){ fprintf(stderr, "\nERROR around arg %d (%s).\n", iarg, arg ? arg : "unknown"); fprintf(stderr, "USAGE: %s [flags] where flags are:\n", name); fprintf(stderr, " -v <verb> : verbosity level\n"); fprintf(stderr, " -O <enum OSTYPE #> : set OS type\n"); fprintf(stderr, " -A <enum MACHTYPE #> : set machine/architecture\n"); fprintf(stderr, " -V # # = ((1<<vecISA1) | (1<<vecISA2) | ... | (1<<vecISAN))\n"); fprintf(stderr, " -b <32/64> : set pointer bitwidth\n"); fprintf(stderr, " -o <outfile>\n"); fprintf(stderr, " -C [xc,ic,if,sk,dk,sm,dm,al,ac] <compiler>\n"); fprintf(stderr, " -F [xc,ic,if,sk,dk,sm,dm,al,ac,gc] '<comp flags>'\n"); fprintf(stderr, /* HERE */ " -Fa [xc,ic,if,sk,dk,sm,dm,al,ac,gc] '<comp flags to append>'\n"); fprintf(stderr, " al: append flags to all compilers\n"); fprintf(stderr, " ac: append flags to all C compilers\n"); fprintf(stderr, " -T <targ> : ssh target for cross-compilation (probably broken)\n"); fprintf(stderr, " -S[i/s] <handle> <val> : special int/string arg\n"); fprintf(stderr, " -Si nof77 <0/1> : Have/don't have fortran compiler\n"); fprintf(stderr, "NOTE: enum #s can be found by : make xprint_enums ; ./xprint_enums\n"); exit(iarg);}void GetFlags(int nargs, /* nargs as passed into main */ char **args, /* args as passed into main */ int *verb, /* verbosity setting */ enum OSTYPE *OS, /* OS to assume */ int *vec, /* Vector ISA extension bitfield */ enum MACHTYPE *mach, /* machine/arch to assume */ int *ptrbits /* # of bits in ptr: 32/64 */, char **comps, char **outfile, int *NoF77, char **targ /* mach to ssh to*/ ){ int i, k, k0, kn, DoInt; char *sp, *sp0; *verb = 0; *outfile = NULL; *targ = NULL; for (k=0; k < NCOMP*3; k++) comps[k] = NULL; *ptrbits = 0; *mach = 0; *vec = 0; *OS = 0; *verb = 0; *NoF77 = 0; for (i=1; i < nargs; i++) { if (args[i][0] != '-') PrintUsage(args[0], i, args[i]); switch(args[i][1]) { case 'b': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *ptrbits = atoi(args[i]); break; case 'A': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *mach = atoi(args[i]); break; case 'V': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *vec = atoi(args[i]); break; case 'O': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *OS = atoi(args[i]); break; case 'v': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *verb = atoi(args[i]); break; case 'T': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *targ = args[i]; break; case 'S': if (args[i][2] != 'i' && args[i][2] != 's') PrintUsage(args[0], i, "-S needs i or s suffix!"); DoInt = args[i][2] == 'i'; if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); sp0 = args[i]; if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); if (DoInt) k = atoi(args[i]); else sp = args[i]; if (!strcmp(sp0, "nof77")) *NoF77 = k; else PrintUsage(args[0], i-1, sp0); break; case 'o': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); *outfile = args[i]; break; case 'C': case 'F': if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); sp = args[i]; k = -1; if (*sp == 'i' && sp[1] == 'c') k = ICC_; else if (*sp == 'i' && sp[1] == 'f') k = F77_; else if (*sp == 's' && sp[1] == 'k') k = SKC_; else if (*sp == 'd' && sp[1] == 'k') k = DKC_; else if (*sp == 's' && sp[1] == 'm') k = SMC_; else if (*sp == 'd' && sp[1] == 'm') k = DMC_; else if (*sp == 'x' && sp[1] == 'c') k = XCC_; if (*sp == 'a' && (sp[1] == 'l' || sp[1] == 'c')) { /* only appended flags can be applied to all compilers */ if (args[i-1][1] == 'F') { if (args[i-1][2] == 'a') { k0 = NCOMP+NCOMP; kn = k0 + NCOMP; } else { k0 = NCOMP; kn = NCOMP+NCOMP; } } else { k0 = 0; kn = NCOMP; } if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); for (k=k0; k < kn; k++) if (sp[1] == 'l' || k-2*NCOMP != F77_) comps[k] = args[i]; } else { if (k < 0) PrintUsage(args[0], i, args[i]); if (args[i-1][1] == 'F') { k += NCOMP; if (args[i-1][2] == 'a') k += NCOMP; } if (++i >= nargs) PrintUsage(args[0], i, "out of arguments"); comps[k] = args[i]; } break; default: PrintUsage(args[0], i, args[i]); } }/* * allocate these strings ourselves so we can free them later if necessary */ for (i=0; i < 3*NCOMP; i++) { if (comps[i]) { if (!strcmp(comps[i], "default")) comps[i] = NULL; else { sp = malloc(sizeof(char)*(strlen(comps[i])+1)); strcpy(sp, comps[i]); comps[i] = sp; } } } if (*ptrbits != 32 && *ptrbits != 64) *ptrbits = 0;}main(int nargs, char **args)/* * probe_comp has the following responsibilities: * 1. Read in atlcomp.txt for recommended compiler and flags * 2. Accept user override of compiler/flags * 3. Append any user appended flags * 4. Ensure all non-xcc C compilers interoperate by calling probe_ccomps * 5. Figure out F77/C interoperating rules by calling probe_f772c * 6. Printing out results of these probes for later use */{ enum OSTYPE OS; enum MACHTYPE mach; int ptrbits, verb, vecexts, i, nof77; char *usrcomps[3*NCOMP]; char *outfile, *targ, *targarg; enum F2CNAME f2cnam; enum F2CINT f2cint; enum F2CSTRING f2cstr; GetFlags(nargs, args, &verb, &OS, &vecexts, &mach, &ptrbits, usrcomps, &outfile, &nof77, &targ); if (verb > 1) { fprintf(stdout, "User Override Compilers:\n"); for (i=0; i < NCOMP; i++) fprintf(stdout, " '%s' : '%s' '%s'\n", usrcomps[i] ? usrcomps[i]:"none", usrcomps[i+NCOMP] ? usrcomps[i+NCOMP]:"none", usrcomps[i+2*NCOMP] ? usrcomps[i+2*NCOMP]:"none"); fprintf(stdout, "\n"); } if (targ) { targarg = malloc(sizeof(char)*(strlen(targ)+24)); assert(targarg); sprintf(targarg, "-T '%s'", targ); } else targarg = ""; GetComps(OS, mach, verb, targ, ptrbits, usrcomps, nof77); TestComps(OS, mach, verb, targ, targarg, usrcomps, &f2cnam, &f2cint, &f2cstr, nof77); if (verb) { fprintf(stdout, "Compilers:\n"); for (i=0; i < NCOMP; i++) fprintf(stdout, " '%s' : '%s'\n", usrcomps[i], usrcomps[NCOMP+i]); fprintf(stdout, "\n"); } PrintCompResults(outfile, usrcomps, f2cnam, f2cint, f2cstr); if (targ) free(targarg); exit(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -