add common linkage for data

This commit is contained in:
Quentin Carbonneaux 2024-04-12 11:32:36 +02:00
parent 4a809d69b5
commit 8ded7a56a2
4 changed files with 21 additions and 3 deletions

1
all.h
View file

@ -371,6 +371,7 @@ struct Addr { /* amd64 addressing */
struct Lnk {
char export;
char thread;
char common;
char align;
char *sec;
char *secf;

14
emit.c
View file

@ -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)

View file

@ -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");

View file

@ -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 {