summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerry Jelinek <jerry.jelinek@joyent.com>2018-10-23 13:07:51 +0000
committerJerry Jelinek <jerry.jelinek@joyent.com>2018-10-23 13:07:51 +0000
commitffe74e17db37f9d0aa120a35a5cfcf2d7342dadb (patch)
tree1a2afc52bc0e46bafd28b1ef2ce737a817e1e864
parent474a8f549c7e430ac55a4b1b8a1fe7be51478412 (diff)
parentd0843a33a8ba49c316537132aa23e7df6d6fc64b (diff)
downloadillumos-joyent-ffe74e17db37f9d0aa120a35a5cfcf2d7342dadb.tar.gz
[illumos-gate merge]
commit d0843a33a8ba49c316537132aa23e7df6d6fc64b 9899 cw(1onbld) should shadow more compilation 9888 cw shouldn't use __unused commit 42a3762d0138d6dd0c0f96964be98d0b21ab6bef 9913 git pbchk should still accept -b Conflicts: usr/src/tools/cw/cw.c
-rw-r--r--usr/src/tools/cw/cw.1onbld9
-rw-r--r--usr/src/tools/cw/cw.c111
-rw-r--r--usr/src/tools/scripts/git-pbchk.py10
3 files changed, 85 insertions, 45 deletions
diff --git a/usr/src/tools/cw/cw.1onbld b/usr/src/tools/cw/cw.1onbld
index da3f224cd2..62800bb727 100644
--- a/usr/src/tools/cw/cw.1onbld
+++ b/usr/src/tools/cw/cw.1onbld
@@ -137,11 +137,10 @@ will invoke each shadow compiler, with the outputs modified (as well as any
translation for compiler style) as follows:
.Bl -enum
.It
-If neither of
-.Fl c ,
-.Fl S
-appears in the argument list (that is, linking is attempted or only the
-pre-processor is invoked), the shadow compilers will not be invoked.
+If
+.Nm cw
+is invoked to link-edit without compilation (the input files are all objects),
+the shadow compiler is not invoked.
.It
If the
.Fl o Ar filename
diff --git a/usr/src/tools/cw/cw.c b/usr/src/tools/cw/cw.c
index 16cbbd965a..91d62075dc 100644
--- a/usr/src/tools/cw/cw.c
+++ b/usr/src/tools/cw/cw.c
@@ -308,7 +308,7 @@ typedef struct cw_ictx {
int i_oldargc;
char **i_oldargv;
pid_t i_pid;
- char i_discard[MAXPATHLEN];
+ char *i_discard;
char *i_stderr;
} cw_ictx_t;
@@ -479,12 +479,6 @@ optim_disable(struct aelist *h, int level)
}
}
-/* ARGSUSED */
-static void
-Xamode(struct aelist *h __attribute__((__unused__)))
-{
-}
-
static void
Xsmode(struct aelist *h)
{
@@ -559,6 +553,35 @@ xlate(struct aelist *h, const char *xarg, const char **table)
}
}
+/*
+ * The compiler wants the output file to end in appropriate extension. If
+ * we're generating a name from whole cloth (path == NULL), we assume that
+ * extension to be .o, otherwise we match the extension of the caller.
+ */
+static char *
+discard_file_name(const char *path)
+{
+ char *ret, *ext, *file;
+
+ if (path == NULL) {
+ ext = ".o";
+ } else {
+ ext = strrchr(path, '.');
+ }
+
+ if ((ret = calloc(MAXPATHLEN, sizeof (char))) == NULL)
+ nomem();
+
+ if ((file = tempnam(NULL, ".cw")) == NULL)
+ nomem();
+
+ (void) strlcpy(ret, file, MAXPATHLEN);
+ if (ext != NULL)
+ (void) strlcat(ret, ext, MAXPATHLEN);
+ free(file);
+ return (ret);
+}
+
static void
do_gcc(cw_ictx_t *ctx)
{
@@ -568,7 +591,7 @@ do_gcc(cw_ictx_t *ctx)
cw_op_t op = CW_O_LINK;
char *model = NULL;
char *nameflag;
- int mflag = 0;
+ int mflag = 0;
if (ctx->i_flags & CW_F_PROG) {
newae(ctx->i_ae, "--version");
@@ -636,10 +659,12 @@ do_gcc(cw_ictx_t *ctx)
* output is always discarded for the secondary
* compiler.
*/
- if ((ctx->i_flags & CW_F_SHADOW) && in_output)
+ if ((ctx->i_flags & CW_F_SHADOW) && in_output) {
+ ctx->i_discard = discard_file_name(arg);
newae(ctx->i_ae, ctx->i_discard);
- else
+ } else {
newae(ctx->i_ae, arg);
+ }
in_output = 0;
continue;
}
@@ -755,6 +780,7 @@ do_gcc(cw_ictx_t *ctx)
newae(ctx->i_ae, arg);
} else if (ctx->i_flags & CW_F_SHADOW) {
newae(ctx->i_ae, "-o");
+ ctx->i_discard = discard_file_name(arg);
newae(ctx->i_ae, ctx->i_discard);
} else {
newae(ctx->i_ae, arg);
@@ -996,7 +1022,6 @@ do_gcc(cw_ictx_t *ctx)
case 'X':
if (strcmp(arg, "-Xa") == 0 ||
strcmp(arg, "-Xt") == 0) {
- Xamode(ctx->i_ae);
break;
}
if (strcmp(arg, "-Xs") == 0) {
@@ -1194,8 +1219,16 @@ do_gcc(cw_ictx_t *ctx)
free(nameflag);
- if (c_files > 1 && (ctx->i_flags & CW_F_SHADOW) &&
- op != CW_O_PREPROCESS) {
+ /*
+ * When compiling multiple source files in a single invocation some
+ * compilers output objects into the current directory with
+ * predictable and conventional names.
+ *
+ * We prevent any attempt to compile multiple files at once so that
+ * any such objects created by a shadow can't escape into a later
+ * link-edit.
+ */
+ if (c_files > 1 && op != CW_O_PREPROCESS) {
errx(2, "multiple source files are "
"allowed only with -E or -P");
}
@@ -1263,15 +1296,19 @@ do_gcc(cw_ictx_t *ctx)
exit(2);
}
- if ((op == CW_O_LINK || op == CW_O_PREPROCESS) &&
- (ctx->i_flags & CW_F_SHADOW))
- exit(0);
+ if (ctx->i_flags & CW_F_SHADOW) {
+ if (op == CW_O_PREPROCESS)
+ exit(0);
+ else if (op == CW_O_LINK && c_files == 0)
+ exit(0);
+ }
if (model != NULL)
newae(ctx->i_ae, model);
if (!nolibc)
newae(ctx->i_ae, "-lc");
if (!seen_o && (ctx->i_flags & CW_F_SHADOW)) {
+ ctx->i_discard = discard_file_name(NULL);
newae(ctx->i_ae, "-o");
newae(ctx->i_ae, ctx->i_discard);
}
@@ -1280,7 +1317,7 @@ do_gcc(cw_ictx_t *ctx)
static void
do_cc(cw_ictx_t *ctx)
{
- int in_output = 0, seen_o = 0;
+ int in_output = 0, seen_o = 0, c_files = 0;
cw_op_t op = CW_O_LINK;
char *nameflag;
@@ -1294,6 +1331,7 @@ do_cc(cw_ictx_t *ctx)
while (--ctx->i_oldargc > 0) {
char *arg = *++ctx->i_oldargv;
+ size_t arglen = strlen(arg);
if (strncmp(arg, "-_CC=", 5) == 0) {
newae(ctx->i_ae, strchr(arg, '=') + 1);
@@ -1301,10 +1339,17 @@ do_cc(cw_ictx_t *ctx)
}
if (*arg != '-') {
+ if (!in_output && arglen > 2 &&
+ arg[arglen - 2] == '.' &&
+ (arg[arglen - 1] == 'S' || arg[arglen - 1] == 's' ||
+ arg[arglen - 1] == 'c' || arg[arglen - 1] == 'i'))
+ c_files++;
+
if (in_output == 0 || !(ctx->i_flags & CW_F_SHADOW)) {
newae(ctx->i_ae, arg);
} else {
in_output = 0;
+ ctx->i_discard = discard_file_name(arg);
newae(ctx->i_ae, ctx->i_discard);
}
continue;
@@ -1329,6 +1374,7 @@ do_cc(cw_ictx_t *ctx)
newae(ctx->i_ae, arg);
} else if (ctx->i_flags & CW_F_SHADOW) {
newae(ctx->i_ae, "-o");
+ ctx->i_discard = discard_file_name(arg);
newae(ctx->i_ae, ctx->i_discard);
} else {
newae(ctx->i_ae, arg);
@@ -1352,12 +1398,22 @@ do_cc(cw_ictx_t *ctx)
free(nameflag);
- if ((op == CW_O_LINK || op == CW_O_PREPROCESS) &&
- (ctx->i_flags & CW_F_SHADOW))
- exit(0);
+ /* See the comment on this same code in do_gcc() */
+ if (c_files > 1 && op != CW_O_PREPROCESS) {
+ errx(2, "multiple source files are "
+ "allowed only with -E or -P");
+ }
+
+ if (ctx->i_flags & CW_F_SHADOW) {
+ if (op == CW_O_PREPROCESS)
+ exit(0);
+ else if (op == CW_O_LINK && c_files == 0)
+ exit(0);
+ }
if (!seen_o && (ctx->i_flags & CW_F_SHADOW)) {
newae(ctx->i_ae, "-o");
+ ctx->i_discard = discard_file_name(NULL);
newae(ctx->i_ae, ctx->i_discard);
}
}
@@ -1467,6 +1523,7 @@ reap(cw_ictx_t *ctx)
} while (!WIFEXITED(status) && !WIFSIGNALED(status));
(void) unlink(ctx->i_discard);
+ free(ctx->i_discard);
if (stat(ctx->i_stderr, &s) < 0) {
warn("stat failed on child cleanup");
@@ -1497,20 +1554,6 @@ reap(cw_ictx_t *ctx)
static int
exec_ctx(cw_ictx_t *ctx, int block)
{
- char *file;
-
- /*
- * To avoid offending cc's sensibilities, the name of its output
- * file must end in '.o'.
- */
- if ((file = tempnam(NULL, ".cw")) == NULL) {
- nomem();
- return (-1);
- }
- (void) strlcpy(ctx->i_discard, file, MAXPATHLEN);
- (void) strlcat(ctx->i_discard, ".o", MAXPATHLEN);
- free(file);
-
if ((ctx->i_stderr = tempnam(NULL, ".cw")) == NULL) {
nomem();
return (-1);
diff --git a/usr/src/tools/scripts/git-pbchk.py b/usr/src/tools/scripts/git-pbchk.py
index 0d3fc89f1e..7f3956ac42 100644
--- a/usr/src/tools/scripts/git-pbchk.py
+++ b/usr/src/tools/scripts/git-pbchk.py
@@ -375,27 +375,25 @@ def main(cmd, args):
checkname = None
try:
- opts, args = getopt.getopt(args, 'c:p:')
+ opts, args = getopt.getopt(args, 'b:c:p:')
except getopt.GetoptError, e:
sys.stderr.write(str(e) + '\n')
sys.stderr.write("Usage: %s [-c check] [-p branch] [path...]\n" % cmd)
sys.exit(1)
for opt, arg in opts:
- # backwards compatibility
- if opt == '-b':
+ # We accept "-b" as an alias of "-p" for backwards compatibility.
+ if opt == '-p' or opt == '-b':
parent_branch = arg
elif opt == '-c':
checkname = arg
- elif opt == '-p':
- parent_branch = arg
if not parent_branch:
parent_branch = git_parent_branch(git_branch())
if checkname is None:
if cmd == 'git-pbchk':
- checkname= 'pbchk'
+ checkname = 'pbchk'
else:
checkname = 'nits'