aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin Carbonneaux <[email protected]>2024-04-12 11:32:36 +0200
committerQuentin Carbonneaux <[email protected]>2024-04-12 11:33:58 +0200
commit8ded7a56a2d7f1922b4f58a953f9ac37aa8be737 (patch)
tree863aa56ca7b0b35cf33539ae82960db75c27fe20
parent4a809d69b5647aabc8f6a9e22e0bc889f9c779ed (diff)
add common linkage for data
-rw-r--r--all.h1
-rw-r--r--emit.c14
-rw-r--r--parse.c7
-rw-r--r--tools/lexh.c2
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 {