diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-03-19 03:05:24 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-03-19 03:05:24 +0100 |
commit | da9b38c75c11cc7f18415849b5bf14579ef8317c (patch) | |
tree | 427a69021fef7444f35b9880677c6bdce63e68d9 /sys/src/cmd/ql | |
parent | bd178b6dc6a6d6a81be05c0a1f7c03b352f833c1 (diff) |
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.
Diffstat (limited to 'sys/src/cmd/ql')
-rw-r--r-- | sys/src/cmd/ql/asm.c | 2 | ||||
-rw-r--r-- | sys/src/cmd/ql/l.h | 1 | ||||
-rw-r--r-- | sys/src/cmd/ql/obj.c | 3 |
3 files changed, 5 insertions, 1 deletions
diff --git a/sys/src/cmd/ql/asm.c b/sys/src/cmd/ql/asm.c index 8930ddae8..b980aff8e 100644 --- a/sys/src/cmd/ql/asm.c +++ b/sys/src/cmd/ql/asm.c @@ -756,7 +756,7 @@ datblk(long s, long n) } 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); diff --git a/sys/src/cmd/ql/l.h b/sys/src/cmd/ql/l.h index 9556a20a6..fd56f6882 100644 --- a/sys/src/cmd/ql/l.h +++ b/sys/src/cmd/ql/l.h @@ -61,6 +61,7 @@ struct Sym short become; short frame; uchar subtype; + char dupok; ushort file; long value; long sig; diff --git a/sys/src/cmd/ql/obj.c b/sys/src/cmd/ql/obj.c index 9e4dcf02e..c6c4e26dc 100644 --- a/sys/src/cmd/ql/obj.c +++ b/sys/src/cmd/ql/obj.c @@ -849,6 +849,8 @@ loop: 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 @@ lookup(char *symb, int v) s->version = v; s->value = 0; s->sig = 0; + s->dupok = 0; hash[h] = s; return s; } |