From 8ded7a56a2d7f1922b4f58a953f9ac37aa8be737 Mon Sep 17 00:00:00 2001 From: Quentin Carbonneaux Date: Fri, 12 Apr 2024 11:32:36 +0200 Subject: [PATCH] add common linkage for data --- all.h | 1 + emit.c | 14 +++++++++++++- parse.c | 7 ++++++- tools/lexh.c | 2 +- 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/all.h b/all.h index bd61510..bb6f096 100644 --- a/all.h +++ b/all.h @@ -371,6 +371,7 @@ struct Addr { /* amd64 addressing */ struct Lnk { char export; char thread; + char common; char align; char *sec; char *secf; diff --git a/emit.c b/emit.c index 490628e..82eba9e 100644 --- a/emit.c +++ b/emit.c @@ -75,7 +75,17 @@ emitdat(Dat *d, FILE *f) zero = 0; break; case DEnd: - if (zero != -1) { + if (d->lnk->common) { + if (zero == -1) + die("invalid common data definition"); + p = d->name[0] == '"' ? "" : T.assym; + fprintf(f, ".comm %s%s,%"PRId64, + p, d->name, zero); + if (d->lnk->align) + fprintf(f, ",%d", d->lnk->align); + fputc('\n', f); + } + else if (zero != -1) { emitlnk(d->name, d->lnk, SecBss, f); fprintf(f, "\t.fill %"PRId64",1,0\n", zero); } @@ -87,6 +97,8 @@ emitdat(Dat *d, FILE *f) fprintf(f, "\t.fill %"PRId64",1,0\n", d->u.num); break; default: + if (d->lnk->common) + die("unsupported common data item"); if (zero != -1) { emitlnk(d->name, d->lnk, SecData, f); if (zero > 0) diff --git a/parse.c b/parse.c index db861bf..a909b7d 100644 --- a/parse.c +++ b/parse.c @@ -48,6 +48,7 @@ enum Token { Thlt, Texport, Tthread, + Tcommon, Tfunc, Ttype, Tdata, @@ -106,6 +107,7 @@ static char *kwmap[Ntok] = { [Thlt] = "hlt", [Texport] = "export", [Tthread] = "thread", + [Tcommon] = "common", [Tfunc] = "function", [Ttype] = "type", [Tdata] = "data", @@ -132,7 +134,7 @@ enum { TMask = 16383, /* for temps hash */ BMask = 8191, /* for blocks hash */ - K = 9583425, /* found using tools/lexh.c */ + K = 11183273, /* found using tools/lexh.c */ M = 23, }; @@ -1159,6 +1161,9 @@ parselnk(Lnk *lnk) case Tthread: lnk->thread = 1; break; + case Tcommon: + lnk->common = 1; + break; case Tsection: if (lnk->sec) err("only one section allowed"); diff --git a/tools/lexh.c b/tools/lexh.c index 1b4a7fb..efc30fe 100644 --- a/tools/lexh.c +++ b/tools/lexh.c @@ -29,7 +29,7 @@ char *tok[] = { "function", "type", "data", "section", "align", "dbgfile", "blit", "l", "w", "sh", "uh", "h", "sb", "ub", "b", "d", "s", "z", "loadw", "loadl", "loads", "loadd", - "alloc1", "alloc2", + "alloc1", "alloc2", "thread", "common", }; enum {