git: 9front

Download patch

ref: 9f86d052574377d3ea2db0a0937e8825d8258b38
parent: b0d1f743a9c533a8b982a74e7531462d39e72781
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Mar 18 23:05:24 EDT 2017

5l,6l,8l,kl,ql,vl: allow duplicate GLOBAL symbols (from Ori Bernstein)

The plan 9 assemblers support the DUPOK flag on text symbols. They parse and
ignore it on GLOBL symbols. This patch makes it work in the linkers.

The reason I ran into this is because my programming language (Myrddin) uses
data symbols to generate type information, and it's useful to avoid
duplicating all of the type info in every file that gets generated.

--- a/sys/src/cmd/5l/asm.c
+++ b/sys/src/cmd/5l/asm.c
@@ -578,7 +578,7 @@
 		}
 		if(l >= n)
 			continue;
-		if(p->as != AINIT && p->as != ADYNT) {
+		if(p->as != AINIT && p->as != ADYNT && !p->from.sym->dupok) {
 			for(j=l+(c-i)-1; j>=l; j--)
 				if(buf.dbuf[j]) {
 					print("%P\n", p);
--- a/sys/src/cmd/5l/l.h
+++ b/sys/src/cmd/5l/l.h
@@ -82,6 +82,7 @@
 	short	become;
 	short	frame;
 	uchar	subtype;
+	char	dupok;
 	ushort	file;
 	long	value;
 	long	sig;
--- a/sys/src/cmd/5l/obj.c
+++ b/sys/src/cmd/5l/obj.c
@@ -868,6 +868,8 @@
 			diag("GLOBL must have a name\n%P", p);
 			errorexit();
 		}
+		if(p->reg & DUPOK)
+			s->dupok = 1;
 		if(s->type == 0 || s->type == SXREF) {
 			s->type = SBSS;
 			s->value = 0;
@@ -1113,6 +1115,7 @@
 	s->version = v;
 	s->value = 0;
 	s->sig = 0;
+	s->dupok = 0;
 	hash[h] = s;
 	return s;
 }
--- a/sys/src/cmd/6l/asm.c
+++ b/sys/src/cmd/6l/asm.c
@@ -316,7 +316,7 @@
 		}
 		if(l >= n)
 			continue;
-		if(p->as != AINIT && p->as != ADYNT) {
+		if(p->as != AINIT && p->as != ADYNT && !p->from.sym->dupok) {
 			for(j=l+(c-i)-1; j>=l; j--)
 				if(buf.dbuf[j]) {
 					print("%P\n", p);
--- a/sys/src/cmd/6l/l.h
+++ b/sys/src/cmd/6l/l.h
@@ -79,6 +79,7 @@
 	short	version;
 	short	become;
 	short	frame;
+	char	dupok;
 	uchar	subtype;
 	ushort	file;
 	vlong	value;
--- a/sys/src/cmd/6l/list.c
+++ b/sys/src/cmd/6l/list.c
@@ -23,6 +23,7 @@
 	bigP = p;
 	switch(p->as) {
 	case ATEXT:
+	case AGLOBL:
 		if(p->from.scale) {
 			snprint(str, sizeof str, "(%ld)	%A	%D,%d,%D",
 				p->line, p->as, &p->from, p->from.scale, &p->to);
--- a/sys/src/cmd/6l/obj.c
+++ b/sys/src/cmd/6l/obj.c
@@ -899,10 +899,13 @@
 
 	case AGLOBL:
 		s = p->from.sym;
+		if(p->from.scale & DUPOK)
+			s->dupok = 1;
 		if(s->type == 0 || s->type == SXREF) {
 			s->type = SBSS;
 			s->value = 0;
 		}
+
 		if(s->type != SBSS) {
 			diag("%s: redefinition: %s in %s",
 				pn, s->name, TNAME);
@@ -1158,6 +1161,7 @@
 	s->version = v;
 	s->value = 0;
 	s->sig = 0;
+	s->dupok = 0;
 	hash[h] = s;
 	nsymbol++;
 	return s;
--- a/sys/src/cmd/8l/asm.c
+++ b/sys/src/cmd/8l/asm.c
@@ -421,7 +421,7 @@
 		}
 		if(l >= n)
 			continue;
-		if(p->as != AINIT && p->as != ADYNT) {
+		if(p->as != AINIT && p->as != ADYNT && !p->from.sym->dupok) {
 			for(j=l+(c-i)-1; j>=l; j--)
 				if(buf.dbuf[j]) {
 					print("%P\n", p);
--- a/sys/src/cmd/8l/l.h
+++ b/sys/src/cmd/8l/l.h
@@ -80,6 +80,7 @@
 	short	become;
 	short	frame;
 	uchar	subtype;
+	char	dupok;
 	ushort	file;
 	long	value;
 	long	sig;
--- a/sys/src/cmd/8l/list.c
+++ b/sys/src/cmd/8l/list.c
@@ -23,6 +23,7 @@
 	bigP = p;
 	switch(p->as) {
 	case ATEXT:
+	case AGLOBL:
 		if(p->from.scale) {
 			snprint(str, sizeof(str), "(%ld)	%A	%D,%d,%D",
 				p->line, p->as, &p->from, p->from.scale, &p->to);
--- a/sys/src/cmd/8l/obj.c
+++ b/sys/src/cmd/8l/obj.c
@@ -885,6 +885,8 @@
 
 	case AGLOBL:
 		s = p->from.sym;
+		if(p->from.scale & DUPOK)
+			s->dupok = 1;
 		if(s->type == 0 || s->type == SXREF) {
 			s->type = SBSS;
 			s->value = 0;
@@ -1134,6 +1136,7 @@
 	s->version = v;
 	s->value = 0;
 	s->sig = 0;
+	s->dupok = 0;
 	hash[h] = s;
 	nsymbol++;
 	return s;
--- a/sys/src/cmd/kl/asm.c
+++ b/sys/src/cmd/kl/asm.c
@@ -396,7 +396,7 @@
 		}
 		if(l >= n)
 			continue;
-		if(p->as != AINIT && p->as != ADYNT) {
+		if(p->as != AINIT && p->as != ADYNT && !p->from.sym->dupok) {
 			for(j=l+(c-i)-1; j>=l; j--)
 				if(buf.dbuf[j]) {
 					print("%P\n", p);
--- a/sys/src/cmd/kl/l.h
+++ b/sys/src/cmd/kl/l.h
@@ -65,6 +65,7 @@
 	short	version;
 	short	become;
 	short	frame;
+	char	dupok;
 	long	value;
 	Sym	*link;
 };
--- a/sys/src/cmd/kl/obj.c
+++ b/sys/src/cmd/kl/obj.c
@@ -737,6 +737,8 @@
 			diag("GLOBL must have a name\n%P", p);
 			errorexit();
 		}
+		if(p->reg & DUPOK)
+			s->dupok = 1;
 		if(s->type == 0 || s->type == SXREF) {
 			s->type = SBSS;
 			s->value = 0;
@@ -951,6 +953,7 @@
 	s->type = 0;
 	s->version = v;
 	s->value = 0;
+	s->dupok = 0;
 	hash[h] = s;
 	return s;
 }
--- a/sys/src/cmd/ql/asm.c
+++ b/sys/src/cmd/ql/asm.c
@@ -756,7 +756,7 @@
 		}
 		if(l >= n)
 			continue;
-		if(p->as != AINIT && p->as != ADYNT) {
+		if(p->as != AINIT && p->as != ADYNT && !p->from.sym->dupok) {
 			for(j=l+(c-i)-1; j>=l; j--)
 				if(buf.dbuf[j]) {
 					print("%P\n", p);
--- a/sys/src/cmd/ql/l.h
+++ b/sys/src/cmd/ql/l.h
@@ -61,6 +61,7 @@
 	short	become;
 	short	frame;
 	uchar	subtype;
+	char	dupok;
 	ushort	file;
 	long	value;
 	long	sig;
--- a/sys/src/cmd/ql/obj.c
+++ b/sys/src/cmd/ql/obj.c
@@ -849,6 +849,8 @@
 			diag("GLOBL must have a name\n%P", p);
 			errorexit();
 		}
+		if(p->reg & DUPOK)
+			s->dupok = 1; 
 		if(s->type == 0 || s->type == SXREF) {
 			s->type = SBSS;
 			s->value = 0;
@@ -1085,6 +1087,7 @@
 	s->version = v;
 	s->value = 0;
 	s->sig = 0;
+	s->dupok = 0;
 	hash[h] = s;
 	return s;
 }
--- a/sys/src/cmd/vl/asm.c
+++ b/sys/src/cmd/vl/asm.c
@@ -708,7 +708,7 @@
 		}
 		if(l >= n)
 			continue;
-		if(p->as != AINIT && p->as != ADYNT) {
+		if(p->as != AINIT && p->as != ADYNT && !p->from.sym->dupok) {
 			for(j=l+(c-i)-1; j>=l; j--)
 				if(buf.dbuf[j]) {
 					print("%P\n", p);
--- a/sys/src/cmd/vl/l.h
+++ b/sys/src/cmd/vl/l.h
@@ -74,6 +74,7 @@
 	short	version;
 	short	become;
 	short	frame;
+	char	dupok;
 	long	value;
 	Sym*	link;
 };
--- a/sys/src/cmd/vl/obj.c
+++ b/sys/src/cmd/vl/obj.c
@@ -803,6 +803,8 @@
 			diag("GLOBL must have a name\n%P", p);
 			errorexit();
 		}
+		if (p->reg & DUPOK)
+			s->dupok = 1;
 		if(s->type == 0 || s->type == SXREF) {
 			s->type = SBSS;
 			s->value = 0;
@@ -1036,6 +1038,7 @@
 	s->type = 0;
 	s->version = v;
 	s->value = 0;
+	s->dupok = 0;
 	hash[h] = s;
 	return s;
 }
--