Browse Source

Make 8* build on Linux.

Also, add the resulting binaries to gitignore.
Signed-off-by: John Floren <john@jfloren.net>

Change-Id: I15b031347d6f0f8f00c3c6d8c6b6dae8aa536bfb
Reviewed-on: http://nxm.coreboot.org/review/165
Tested-by: Jenkins QA
Reviewed-by: ron minnich <rminnich@gmail.com>
John Floren 11 years ago
parent
commit
a935836942
8 changed files with 140 additions and 26 deletions
  1. 10 0
      .gitignore
  2. 5 0
      util/8a/BUILD
  3. 8 0
      util/8c/BUILD
  4. 2 2
      util/8c/swt.c
  5. 12 0
      util/8l/BUILD
  6. 2 2
      util/8l/compat.c
  7. 1 0
      util/8l/l.h
  8. 100 22
      util/8l/obj.c

+ 10 - 0
.gitignore

@@ -8,12 +8,18 @@
 *.so
 *.a
 *.a6
+*.a8
 *.6
+*.8
 6.out
+8.out
 y.tab.*
 xbin/6a
 xbin/6c
 xbin/6l
+xbin/8a
+xbin/8c
+xbin/8l
 xbin/ar
 xbin/cpp
 xbin/data2s
@@ -24,12 +30,16 @@ xbin/pcc
 xbin/wrkey
 6.out
 6.*
+8.*
 o.out
 o.*
 y.debug
 util/6a/6a
 util/6c/6c
 util/6l/6l
+util/8a/8a
+util/8c/8c
+util/8l/8l
 util/mksys
 
 # Packages #

+ 5 - 0
util/8a/BUILD

@@ -0,0 +1,5 @@
+. $NXM/buildconfig
+$PLAN9/bin/yacc -D1 -d a.y
+9c -g -I . *.c
+9l -o 8a *.o
+cp 8a $NXM/xbin

+ 8 - 0
util/8c/BUILD

@@ -0,0 +1,8 @@
+. $NXM/buildconfig
+
+rm -f *.o
+
+(cd ../cc; $PLAN9/bin/yacc -D1 -d cc.y)
+9c -g -I . -I ../cc ../cc/*.c *.c && 9l -o 8c *.o
+cp 8c $NXM/xbin
+

+ 2 - 2
util/8c/swt.c

@@ -503,7 +503,7 @@ align(long i, Type *t, int op)
 		o = align(o, t, Ael2);
 		break;
 	}
-	o = round(o, w);
+	o = p9round(o, w);
 	if(debug['A'])
 		print("align %s %ld %T = %ld\n", bnames[op], i, t, o);
 	return o;
@@ -514,6 +514,6 @@ maxround(long max, long v)
 {
 	v += SZ_LONG-1;
 	if(v > max)
-		max = round(v, SZ_LONG);
+		max = p9round(v, SZ_LONG);
 	return max;
 }

+ 12 - 0
util/8l/BUILD

@@ -0,0 +1,12 @@
+. $NXM/buildconfig
+9c -g -I . *.c ../8c/enam.c
+9l -o 8l \
+asm.o \
+compat.o \
+enam.o \
+list.o \
+obj.o \
+optab.o \
+pass.o \
+span.o
+cp 8l $NXM/xbin

+ 2 - 2
util/8l/compat.c

@@ -36,7 +36,7 @@ calloc(ulong m, ulong n)
 }
 
 void*
-realloc(void*, ulong)
+realloc(void* unused1, ulong unused2)
 {
 	fprint(2, "realloc called\n");
 	abort();
@@ -52,5 +52,5 @@ mysbrk(ulong size)
 void
 setmalloctag(void *v, ulong pc)
 {
-	USED(v, pc);
+	//USED(v, pc);
 }

+ 1 - 0
util/8l/l.h

@@ -283,6 +283,7 @@ extern	char*	anames[];
 
 int	Aconv(Fmt*);
 int	Dconv(Fmt*);
+void	Lflag(char*);
 int	Pconv(Fmt*);
 int	Rconv(Fmt*);
 int	Sconv(Fmt*);

+ 100 - 22
util/8l/obj.c

@@ -11,6 +11,10 @@ char	symname[]	= SYMDEF;
 char	thechar		= '8';
 char	*thestring 	= "386";
 
+char**  libdir;
+int     nlibdir = 0;
+static int      maxlibdir = 0;
+
 /*
  *	-H0 -T0x40004C -D0x10000000	is garbage unix
  *	-H1 -T0xd0 -R4			is unix coff
@@ -20,6 +24,13 @@ char	*thestring 	= "386";
  *	-H5 -T0x80100020 -R4096		is ELF
  */
 
+void
+usage(void)
+{
+        diag("usage: 6l [-options] objects");
+        errorexit();
+}
+
 static int
 isobjfile(char *f)
 {
@@ -54,6 +65,7 @@ main(int argc, char *argv[])
 	memset(debug, 0, sizeof(debug));
 	nerrors = 0;
 	outfile = "8.out";
+	Lflag(".");
 	HEADTYPE = -1;
 	INITTEXT = -1;
 	INITDAT = -1;
@@ -78,6 +90,9 @@ main(int argc, char *argv[])
 		if(a)
 			HEADTYPE = atolwhex(a);
 		break;
+        case 'L':
+                Lflag(EARGF(usage()));
+                break;
 	case 'T':
 		a = ARGF();
 		if(a)
@@ -112,8 +127,7 @@ main(int argc, char *argv[])
 	} ARGEND
 	USED(argc);
 	if(*argv == 0) {
-		diag("usage: 8l [-options] objects");
-		errorexit();
+		usage();
 	}
 	if(!debug['9'] && !debug['U'] && !debug['B'])
 		debug[DEFAULT] = 1;
@@ -125,6 +139,9 @@ main(int argc, char *argv[])
 		if(debug['9'])
 			HEADTYPE = 2;
 	}
+
+        Lflag(smprint("%s/386/lib", (a = getenv("NXM")) == 0 ? "" : a));
+
 	switch(HEADTYPE) {
 	default:
 		diag("unknown -H option");
@@ -334,6 +351,31 @@ main(int argc, char *argv[])
 	errorexit();
 }
 
+void
+Lflag(char *arg)
+{
+        char **p;
+	int oldlen;
+
+        if(nlibdir >= maxlibdir) {
+		oldlen = maxlibdir;
+                if (maxlibdir == 0)
+                        maxlibdir = 8;
+                else
+                        maxlibdir *= 2;
+                //p = realloc(libdir, maxlibdir * sizeof(*p));
+		p = malloc(maxlibdir * sizeof(*p));
+		memmove(p, libdir, oldlen);
+		free(libdir);
+                if (p == nil) {
+                        print("too many -L's: %d\n", nlibdir);
+                        usage();
+                }
+                libdir = p;
+        }
+        libdir[nlibdir++] = strdup(arg);
+}
+
 void
 loadlib(void)
 {
@@ -372,20 +414,34 @@ objfile(char *file)
 {
 	long off, esym, cnt, l;
 	int f, work;
+	int i;
 	Sym *s;
 	char magbuf[SARMAG];
+	char libfile[100];
 	char name[100], pname[150];
 	struct ar_hdr arhdr;
 	char *e, *start, *stop;
 
 	if(file[0] == '-' && file[1] == 'l') {
-		if(debug['9'])
-			sprint(name, "/%s/lib/lib", thestring);
-		else
-			sprint(name, "/usr/%clib/lib", thechar);
-		strcat(name, file+2);
-		strcat(name, ".a");
-		file = name;
+                sprint(libfile, "lib");
+                strcat(libfile, file+2);
+                strcat(libfile, ".a");
+//		if(debug['9'])
+//			sprint(name, "/%s/lib/lib", thestring);
+//		else
+//			sprint(name, "/usr/%clib/lib", thechar);
+//		strcat(name, file+2);
+//		strcat(name, ".a");
+//		file = name;
+                for (i = 0; i < nlibdir; i++) {
+                        sprint(name, "%s/", libdir[i]);
+                        strcat(name, libfile);
+                        if (!access(name, AREAD)) {
+                                print("found at %s\n", name);
+                                file = name;
+                                break;
+                        }
+                }
 	}
 	if(debug['v'])
 		Bprint(&bso, "%5.2f ldobj: %s\n", cputime(), file);
@@ -554,8 +610,9 @@ zaddr(uchar *p, Adr *a, Sym *h[])
 void
 addlib(char *obj)
 {
-	char name[1024], comp[256], *p;
+	char name[1024], pname[1024], comp[256], *p;
 	int i;
+	int search = 0;
 
 	if(histfrogp <= 0)
 		return;
@@ -568,15 +625,18 @@ addlib(char *obj)
 		sprint(name, ".");
 		i = 0;
 	} else {
-		if(debug['9'])
-			sprint(name, "/%s/lib", thestring);
-		else
-			sprint(name, "/usr/%clib", thechar);
-		i = 0;
+                sprint(name, "");
+                search = 1;
+                i = 0;
+//		if(debug['9'])
+//			sprint(name, "/%s/lib", thestring);
+//		else
+//			sprint(name, "/usr/%clib", thechar);
+//		i = 0;
 	}
 
 	for(; i<histfrogp; i++) {
-		snprint(comp, sizeof comp, histfrog[i]->name+1);
+		snprint(comp, sizeof comp, "%s", histfrog[i]->name+1);
 		for(;;) {
 			p = strstr(comp, "$O");
 			if(p == 0)
@@ -599,19 +659,35 @@ addlib(char *obj)
 			diag("library component too long");
 			return;
 		}
-		strcat(name, "/");
+		if (i > 0 || !search)
+			strcat(name, "/");
 		strcat(name, comp);
 	}
+        cleanname(name);
+
+        if (search) {
+                // try dot, then -L "libdir", then $NXM/386/lib
+                for (i = 0; i < nlibdir; i++) {
+                        snprint(pname, sizeof pname, "%s/%s", libdir[i], name);
+                        if(debug['v'])
+                                Bprint(&bso, "searching for %s at %s\n", name, pname);
+                        if (access(pname, AEXIST) >= 0)
+                                break;
+                }
+        } else {
+                strcpy(pname, name);
+        }
+
 	for(i=0; i<libraryp; i++)
-		if(strcmp(name, library[i]) == 0)
+		if(strcmp(pname, library[i]) == 0)
 			return;
 	if(libraryp == nelem(library)){
 		diag("too many autolibs; skipping %s", name);
 		return;
 	}
 
-	p = malloc(strlen(name) + 1);
-	strcpy(p, name);
+	p = malloc(strlen(pname) + 1);
+	strcpy(p, pname);
 	library[libraryp] = p;
 	p = malloc(strlen(obj) + 1);
 	strcpy(p, obj);
@@ -729,7 +805,7 @@ ldobj(int f, long c, char *pn)
 	int v, o, r, skip;
 	Sym *h[NSYM], *s, *di;
 	ulong sig;
-	static int files;
+	static int files = 0;
 	static char **filen;
 	char **nfilen;
 
@@ -1163,7 +1239,9 @@ gethunk(void)
 		if(thunk >= 25L*NHUNK)
 			nh = 25L*NHUNK;
 	}
-	h = mysbrk(nh);
+	//h = malloc(nh); //mysbrk(nh);
+	//h = mysbrk(nh);
+	h = sbrk(nh);
 	if(h == (char*)-1) {
 		diag("out of memory");
 		errorexit();