add common linkage for data
This commit is contained in:
parent
4a809d69b5
commit
8ded7a56a2
4 changed files with 21 additions and 3 deletions
1
all.h
1
all.h
|
@ -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
14
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)
|
||||
|
|
7
parse.c
7
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");
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Reference in a new issue