shithub: scc

Download patch

ref: 355f73cb919d009d7527b5083ae8341f0ceea97d
parent: 4cd120c00e9285d5900c7e5a568f82ba6413cb7e
author: Roberto E. Vargas Caballero <[email protected]>
date: Wed Jun 1 01:47:07 EDT 2022

driver/posix: Create ld tool at the end

This is a first step to get a linker command line template,
because the generation of the command line was split in
different places making really hard to apply a templating
approach.

--- a/src/cmd/cc/posix/cc.c
+++ b/src/cmd/cc/posix/cc.c
@@ -67,7 +67,7 @@
 static char *prefix, *objfile, *outfile;
 static char *tmpdir;
 static size_t tmpdirln;
-static struct items objtmp, objout;
+static struct items objtmp, objout, linkargs;
 static int Mflag, Eflag, Sflag, Wflag,
            cflag, dflag, kflag, sflag, Qflag = 1; /* TODO: Remove Qflag */
 static int devnullfd = -1;
@@ -480,28 +480,19 @@
 {
 	int i, tool;
 
-	if (link)
-		inittool(LD);
-
 	for (i = 0; i < chain->n; ++i) {
 		if (!strcmp(chain->s[i], "-l")) {
-			if (link) {
-				addarg(LD, xstrdup(chain->s[i++]));
-				addarg(LD, xstrdup(chain->s[i]));
-			} else {
-				++i;
-			}
+			newitem(&linkargs, chain->s[i++]);
+			newitem(&linkargs, chain->s[i]);
 			continue;
 		}
 		tool = toolfor(chain->s[i]);
 		if (tool == LD) {
-			if (link)
-				addarg(LD, xstrdup(chain->s[i]));
+			newitem(&linkargs, chain->s[i]);
 			continue;
 		}
 		if (buildfile(chain->s[i], tool)) {
-			if (link)
-				addarg(LD, xstrdup(objfile));
+			newitem(&linkargs, objfile);
 			newitem((!link || kflag) ? &objout : &objtmp, objfile);
 		}
 	}
@@ -643,8 +634,13 @@
 		return failure;
 
 	if (link && !failure) {
+		inittool(LD);
+		for (n = 0; n < linkargs.n; ++n)
+			addarg(LD, linkargs.s[n]);
+
 		addarg(LD, xstrdup("-lc"));
 		addarg(LD, xstrdup("-lcrt"));
+
 		for (n = 0; syscrtse[n]; ++n)
 			addarg(LD, path(syscrtse[n]));