Print this page
Review from Robert, and nits
Review from Yuri
        
*** 333,348 ****
  typedef enum {
          GNU,
          SUN
  } compiler_style_t;
  
- #define COMPILER_STYLE(comp) (comp->style == SUN ? "cc" : "gcc")
- 
  typedef struct {
!         char *name;
!         char *path;
!         compiler_style_t style;
  } cw_compiler_t;
  
  typedef struct cw_ictx {
          cw_compiler_t   *i_compiler;
          struct aelist   *i_ae;
--- 333,346 ----
  typedef enum {
          GNU,
          SUN
  } compiler_style_t;
  
  typedef struct {
!         char *c_name;
!         char *c_path;
!         compiler_style_t c_style;
  } cw_compiler_t;
  
  typedef struct cw_ictx {
          cw_compiler_t   *i_compiler;
          struct aelist   *i_ae;
*** 452,462 ****
  };
  
  static void
  nomem(void)
  {
!         (void) errx(1, "out of memory");
  }
  
  static void
  newae(struct aelist *ael, const char *arg)
  {
--- 450,460 ----
  };
  
  static void
  nomem(void)
  {
!         errx(1, "out of memory");
  }
  
  static void
  newae(struct aelist *ael, const char *arg)
  {
*** 521,531 ****
          }
  }
  
  /* ARGSUSED */
  static void
! Xamode(struct aelist *h __attribute__((__unused__)))
  {
  }
  
  static void
  Xcmode(struct aelist *h)
--- 519,529 ----
          }
  }
  
  /* ARGSUSED */
  static void
! Xamode(struct aelist __unused *h)
  {
  }
  
  static void
  Xcmode(struct aelist *h)
*** 656,666 ****
           *
           * -Dunix is also missing in enhanced ANSI mode
           */
          newae(ctx->i_ae, "-D__sun");
  
!         if (asprintf(&nameflag, "-_%s=", ctx->i_compiler->name) == -1)
                  nomem();
  
          /*
           * Walk the argument list, translating as we go ..
           */
--- 654,664 ----
           *
           * -Dunix is also missing in enhanced ANSI mode
           */
          newae(ctx->i_ae, "-D__sun");
  
!         if (asprintf(&nameflag, "-_%s=", ctx->i_compiler->c_name) == -1)
                  nomem();
  
          /*
           * Walk the argument list, translating as we go ..
           */
*** 1405,1425 ****
  
          free(nameflag);
  
          if (c_files > 1 && (ctx->i_flags & CW_F_SHADOW) &&
              op != CW_O_PREPROCESS) {
!                 (void) errx(2, "multiple source files are "
                      "allowed only with -E or -P");
          }
  
          /*
           * Make sure that we do not have any unintended interactions between
           * the xarch options passed in and the version of the Studio compiler
           * used.
           */
          if ((mflag & (SS11|SS12)) == (SS11|SS12)) {
!                 (void) errx(2,
                      "Conflicting \"-xarch=\" flags (both Studio 11 and 12)\n");
          }
  
          switch (mflag) {
          case 0:
--- 1403,1423 ----
  
          free(nameflag);
  
          if (c_files > 1 && (ctx->i_flags & CW_F_SHADOW) &&
              op != CW_O_PREPROCESS) {
!                 errx(2, "multiple source files are "
                      "allowed only with -E or -P");
          }
  
          /*
           * Make sure that we do not have any unintended interactions between
           * the xarch options passed in and the version of the Studio compiler
           * used.
           */
          if ((mflag & (SS11|SS12)) == (SS11|SS12)) {
!                 errx(2,
                      "Conflicting \"-xarch=\" flags (both Studio 11 and 12)\n");
          }
  
          switch (mflag) {
          case 0:
*** 1496,1506 ****
          if (ctx->i_flags & CW_F_PROG) {
                  newae(ctx->i_ae, "-V");
                  return;
          }
  
!         if (asprintf(&nameflag, "-_%s=", ctx->i_compiler->name) == -1)
                  nomem();
  
          while (--ctx->i_oldargc > 0) {
                  char *arg = *++ctx->i_oldargv;
  
--- 1494,1504 ----
          if (ctx->i_flags & CW_F_PROG) {
                  newae(ctx->i_ae, "-V");
                  return;
          }
  
!         if (asprintf(&nameflag, "-_%s=", ctx->i_compiler->c_name) == -1)
                  nomem();
  
          while (--ctx->i_oldargc > 0) {
                  char *arg = *++ctx->i_oldargv;
  
*** 1572,1593 ****
  }
  
  static void
  prepctx(cw_ictx_t *ctx)
  {
!         newae(ctx->i_ae, ctx->i_compiler->path);
  
          if (ctx->i_flags & CW_F_PROG) {
                  (void) printf("%s: %s\n", (ctx->i_flags & CW_F_SHADOW) ?
!                     "shadow" : "primary", ctx->i_compiler->path);
                  (void) fflush(stdout);
          }
  
          if (!(ctx->i_flags & CW_F_XLATE))
                  return;
  
!         switch (ctx->i_compiler->style) {
          case SUN:
                  do_cc(ctx);
                  break;
          case GNU:
                  do_gcc(ctx);
--- 1570,1591 ----
  }
  
  static void
  prepctx(cw_ictx_t *ctx)
  {
!         newae(ctx->i_ae, ctx->i_compiler->c_path);
  
          if (ctx->i_flags & CW_F_PROG) {
                  (void) printf("%s: %s\n", (ctx->i_flags & CW_F_SHADOW) ?
!                     "shadow" : "primary", ctx->i_compiler->c_path);
                  (void) fflush(stdout);
          }
  
          if (!(ctx->i_flags & CW_F_XLATE))
                  return;
  
!         switch (ctx->i_compiler->c_style) {
          case SUN:
                  do_cc(ctx);
                  break;
          case GNU:
                  do_gcc(ctx);
*** 1756,1784 ****
  parse_compiler(const char *spec, cw_compiler_t *compiler)
  {
          char *tspec, *token;
  
          if ((tspec = strdup(spec)) == NULL)
!                 err(1, "out of memory");
  
          if ((token = strsep(&tspec, ",")) == NULL)
                  errx(1, "Compiler is missing a name: %s", spec);
!         compiler->name = token;
  
          if ((token = strsep(&tspec, ",")) == NULL)
                  errx(1, "Compiler is missing a path: %s", spec);
!         compiler->path = token;
  
          if ((token = strsep(&tspec, ",")) == NULL)
                  errx(1, "Compiler is missing a style: %s", spec);
  
          if ((strcasecmp(token, "gnu") == 0) ||
              (strcasecmp(token, "gcc") == 0))
!                 compiler->style = GNU;
          else if ((strcasecmp(token, "sun") == 0) ||
              (strcasecmp(token, "cc") == 0))
!                 compiler->style = SUN;
          else
                  errx(1, "unknown compiler style: %s", token);
  
          if (tspec != NULL)
                  errx(1, "Excess tokens in compiler: %s", spec);
--- 1754,1782 ----
  parse_compiler(const char *spec, cw_compiler_t *compiler)
  {
          char *tspec, *token;
  
          if ((tspec = strdup(spec)) == NULL)
!                 nomem();
  
          if ((token = strsep(&tspec, ",")) == NULL)
                  errx(1, "Compiler is missing a name: %s", spec);
!         compiler->c_name = token;
  
          if ((token = strsep(&tspec, ",")) == NULL)
                  errx(1, "Compiler is missing a path: %s", spec);
!         compiler->c_path = token;
  
          if ((token = strsep(&tspec, ",")) == NULL)
                  errx(1, "Compiler is missing a style: %s", spec);
  
          if ((strcasecmp(token, "gnu") == 0) ||
              (strcasecmp(token, "gcc") == 0))
!                 compiler->c_style = GNU;
          else if ((strcasecmp(token, "sun") == 0) ||
              (strcasecmp(token, "cc") == 0))
!                 compiler->c_style = SUN;
          else
                  errx(1, "unknown compiler style: %s", token);
  
          if (tspec != NULL)
                  errx(1, "Excess tokens in compiler: %s", spec);
*** 1799,1819 ****
          boolean_t vflg = B_FALSE;
          boolean_t Cflg = B_FALSE;
          boolean_t cflg = B_FALSE;
          boolean_t nflg = B_FALSE;
  
!         cw_ictx_t *main_ctx = newictx();
  
          static struct option longopts[] = {
                  { "compiler", no_argument, NULL, 'c' },
!                 { "noecho", no_argument, NULL ,'n' },
                  { "primary", required_argument, NULL, 'p' },
                  { "shadow", required_argument, NULL, 's' },
                  { "versions", no_argument, NULL, 'v' },
                  { NULL, 0, NULL, 0 },
          };
  
          while ((ch = getopt_long(argc, argv, "C", longopts, NULL)) != -1) {
                  switch (ch) {
                  case 'c':
                          cflg = B_TRUE;
                          break;
--- 1797,1822 ----
          boolean_t vflg = B_FALSE;
          boolean_t Cflg = B_FALSE;
          boolean_t cflg = B_FALSE;
          boolean_t nflg = B_FALSE;
  
!         cw_ictx_t *main_ctx;
  
          static struct option longopts[] = {
                  { "compiler", no_argument, NULL, 'c' },
!                 { "noecho", no_argument, NULL, 'n' },
                  { "primary", required_argument, NULL, 'p' },
                  { "shadow", required_argument, NULL, 's' },
                  { "versions", no_argument, NULL, 'v' },
                  { NULL, 0, NULL, 0 },
          };
  
+ 
+         if ((main_ctx = newictx()) == NULL)
+                 nomem();
+ 
+ 
          while ((ch = getopt_long(argc, argv, "C", longopts, NULL)) != -1) {
                  switch (ch) {
                  case 'c':
                          cflg = B_TRUE;
                          break;
*** 1822,1856 ****
                          break;
                  case 'n':
                          nflg = B_TRUE;
                          break;
                  case 'p':
!                         if (primary.path != NULL) {
!                                 warnx("Only one primary compiler may be specified");
                                  usage();
                          }
  
                          if (parse_compiler(optarg, &primary) != 0)
!                                 errx(1, "Couldn't parse %s as a compiler spec", optarg);
                          break;
                  case 's':
                          if (nshadows >= 10)
!                                 errx(1, "May only use 10 shadows at the moment");
                          if (parse_compiler(optarg, &shadows[nshadows]) != 0)
!                                 errx(1, "Couldn't parse %s as a compiler spec", optarg);
                          nshadows++;
                          break;
                  case 'v':
                          vflg = B_TRUE;
                          break;
                  default:
!                         fprintf(stderr, "Did you forget '--'?\n");
                          usage();
                  }
          }
  
!         if (primary.path == NULL) {
                  warnx("A primary compiler must be specified");
                  usage();
          }
  
          do_serial = (getenv("CW_SHADOW_SERIAL") == NULL) ? B_FALSE : B_TRUE;
--- 1825,1863 ----
                          break;
                  case 'n':
                          nflg = B_TRUE;
                          break;
                  case 'p':
!                         if (primary.c_path != NULL) {
!                                 warnx("Only one primary compiler may "
!                                     "be specified");
                                  usage();
                          }
  
                          if (parse_compiler(optarg, &primary) != 0)
!                                 errx(1, "Couldn't parse %s as a compiler spec",
!                                     optarg);
                          break;
                  case 's':
                          if (nshadows >= 10)
!                                 errx(1, "May only use 10 shadows at "
!                                     "the moment");
                          if (parse_compiler(optarg, &shadows[nshadows]) != 0)
!                                 errx(1, "Couldn't parse %s as a compiler spec",
!                                     optarg);
                          nshadows++;
                          break;
                  case 'v':
                          vflg = B_TRUE;
                          break;
                  default:
!                         (void) fprintf(stderr, "Did you forget '--'?\n");
                          usage();
                  }
          }
  
!         if (primary.c_path == NULL) {
                  warnx("A primary compiler must be specified");
                  usage();
          }
  
          do_serial = (getenv("CW_SHADOW_SERIAL") == NULL) ? B_FALSE : B_TRUE;
*** 1858,1870 ****
  
          /* Leave room for argv[0] */
          argc -= (optind - 1);
          argv += (optind - 1);
  
-         if (main_ctx == NULL)
-                 nomem();
- 
          main_ctx->i_oldargc = argc;
          main_ctx->i_oldargv = argv;
          main_ctx->i_flags = CW_F_XLATE;
          if (nflg == 0)
                  main_ctx->i_flags |= CW_F_ECHO;
--- 1865,1874 ----
*** 1873,1883 ****
          if (Cflg)
                  main_ctx->i_flags |= CW_F_CXX;
          main_ctx->i_compiler = &primary;
  
          if (cflg) {
!                 fputs(primary.path, stdout);
          }
  
          if (vflg) {
                  (void) printf("cw version %s\n", CW_VERSION);
                  (void) fflush(stdout);
--- 1877,1887 ----
          if (Cflg)
                  main_ctx->i_flags |= CW_F_CXX;
          main_ctx->i_compiler = &primary;
  
          if (cflg) {
!                 (void) fputs(primary.c_path, stdout);
          }
  
          if (vflg) {
                  (void) printf("cw version %s\n", CW_VERSION);
                  (void) fflush(stdout);
*** 1887,1899 ****
          }
  
          ret |= exec_ctx(main_ctx, do_serial);
  
          for (int i = 0; i < nshadows; i++) {
!                 cw_ictx_t *shadow_ctx = newictx();
  
!                 if (shadow_ctx == NULL)
                          nomem();
  
                  memcpy(shadow_ctx, main_ctx, sizeof (cw_ictx_t));
  
                  shadow_ctx->i_flags |= CW_F_SHADOW;
--- 1891,1903 ----
          }
  
          ret |= exec_ctx(main_ctx, do_serial);
  
          for (int i = 0; i < nshadows; i++) {
!                 cw_ictx_t *shadow_ctx;
  
!                 if ((shadow_ctx = newictx()) == NULL)
                          nomem();
  
                  memcpy(shadow_ctx, main_ctx, sizeof (cw_ictx_t));
  
                  shadow_ctx->i_flags |= CW_F_SHADOW;