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

📄 probe_comp.c

📁 基于Blas CLapck的.用过的人知道是干啥的
💻 C
📖 第 1 页 / 共 3 页
字号:
      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 + -