From fbe3cea2011653434d272fa6643158eeef37a997 Mon Sep 17 00:00:00 2001 From: Scott Graham Date: Tue, 17 Feb 2026 11:49:39 -0800 Subject: [PATCH] Remove NString=80 limit The parser now uses a vector to get tokens into, similar to how quoted strings are handled. This buffer is PFn-scoped, so function and data parsing can use it. Type parsing has to copy its names to the global heap. While this avoids the "identifier too long" error, it of course calls malloc more often, so could potentially have a small negative performance impact on parsing. --- all.h | 11 +++++------ amd64/sysv.c | 2 +- arm64/abi.c | 2 +- parse.c | 21 ++++++++++++--------- rega.c | 2 +- util.c | 15 +++++++++++---- 6 files changed, 31 insertions(+), 22 deletions(-) diff --git a/all.h b/all.h index d00a87f..85f457a 100644 --- a/all.h +++ b/all.h @@ -34,7 +34,6 @@ typedef struct Lnk Lnk; typedef struct Target Target; enum { - NString = 80, NIns = 1 << 20, NAlign = 3, NField = 32, @@ -274,7 +273,7 @@ struct Blk { BSet in[1], out[1], gen[1]; int nlive[2]; int loop; - char name[NString]; + char *name; }; struct Use { @@ -336,7 +335,7 @@ struct Alias { }; struct Tmp { - char name[NString]; + char *name; Ins *def; Use *use; uint ndef, nuse; @@ -415,12 +414,12 @@ struct Fn { char vararg; char dynalloc; char leaf; - char name[NString]; + char *name; Lnk lnk; }; struct Typ { - char name[NString]; + char *name; char isdark; char isunion; int align; @@ -490,7 +489,7 @@ void vfree(void *); void vgrow(void *, ulong); void addins(Ins **, uint *, Ins *); void addbins(Ins **, uint *, Blk *); -void strf(char[NString], char *, ...); +char *strf(char *, ...); uint32_t intern(char *); char *str(uint32_t); int argcls(Ins *, int); diff --git a/amd64/sysv.c b/amd64/sysv.c index 98964c9..ed261b3 100644 --- a/amd64/sysv.c +++ b/amd64/sysv.c @@ -511,7 +511,7 @@ split(Fn *fn, Blk *b) idup(bn, curi, &insb[NIns]-curi); curi = &insb[NIns]; bn->visit = ++b->visit; - strf(bn->name, "%s.%d", b->name, b->visit); + bn->name = strf("%s.%d", b->name, b->visit); bn->loop = b->loop; bn->link = b->link; b->link = bn; diff --git a/arm64/abi.c b/arm64/abi.c index 2bafec7..a4cad07 100644 --- a/arm64/abi.c +++ b/arm64/abi.c @@ -548,7 +548,7 @@ split(Fn *fn, Blk *b) idup(bn, curi, &insb[NIns]-curi); curi = &insb[NIns]; bn->visit = ++b->visit; - strf(bn->name, "%s.%d", b->name, b->visit); + bn->name = strf("%s.%d", b->name, b->visit); bn->loop = b->loop; bn->link = b->link; b->link = bn; diff --git a/parse.c b/parse.c index 9ce04a3..122dd61 100644 --- a/parse.c +++ b/parse.c @@ -235,7 +235,7 @@ getint() static int lex() { - static char tok[NString]; + char *tok; int c, i, esc; int t; @@ -321,10 +321,10 @@ lex() Alpha: if (!isalpha(c) && c != '.' && c != '_') err("invalid character %c (%d)", c, c); + tok = vnew(2, 1, PFn); i = 0; do { - if (i >= NString-1) - err("identifier too long"); + vgrow(&tok, i+2); tok[i++] = c; c = fgetc(inf); } while (isalpha(c) || c == '$' || c == '.' || c == '_' || isdigit(c)); @@ -421,7 +421,7 @@ tmpref(char *v) t = curf->ntmp; tmph[i] = t; newtmp(0, Kx, curf); - strcpy(curf->tmp[t].name, v); + curf->tmp[t].name = v; return TMP(t); } @@ -594,7 +594,7 @@ findblk(char *name) return b; b = newblk(); b->id = nblk++; - strcpy(b->name, name); + b->name = name; b->dlink = blkh[h]; blkh[h] = b; return b; @@ -940,7 +940,7 @@ parsefn(Lnk *lnk) rcls = K0; if (next() != Tglo) err("function name expected"); - strncpy(curf->name, tokval.str, NString-1); + curf->name = tokval.str; curf->vararg = parserefl(0); if (nextnl() != Tlbrace) err("function body must start with {"); @@ -1050,6 +1050,7 @@ parsetyp() ty->size = 0; if (nextnl() != Ttyp || nextnl() != Teq) err("type name and then = expected"); + ty->name = emalloc(strlen(tokval.str)+1); strcpy(ty->name, tokval.str); t = nextnl(); if (t == Talign) { @@ -1115,13 +1116,13 @@ parsedatstr(Dat *d) static void parsedat(void cb(Dat *), Lnk *lnk) { - char name[NString] = {0}; + char *name; int t; Dat d; if (nextnl() != Tglo || nextnl() != Teq) err("data name, then = expected"); - strncpy(name, tokval.str, NString-1); + name = tokval.str; t = nextnl(); lnk->align = 8; if (t == Talign) { @@ -1251,9 +1252,11 @@ parse(FILE *f, char *path, void dbgfile(char *), void data(Dat *), void func(Fn parsetyp(); break; case Teof: - for (n=0; nlink = blist; blist = b1; fn->nblk++; - strf(b1->name, "%s_%s", b->name, s->name); + b1->name = strf("%s_%s", b->name, s->name); stmov += &insb[NIns]-curi; stblk += 1; idup(b1, curi, &insb[NIns]-curi); diff --git a/util.c b/util.c index 5b7abf4..9a12a34 100644 --- a/util.c +++ b/util.c @@ -172,14 +172,21 @@ addbins(Ins **pvins, uint *pnins, Blk *b) addins(pvins, pnins, i); } -void -strf(char str[NString], char *s, ...) +char * +strf(char *s, ...) { va_list ap; + int n; + char *p; va_start(ap, s); - vsnprintf(str, NString, s, ap); + n = vsnprintf(NULL, 0, s, ap); va_end(ap); + p = alloc(n + 1); + va_start(ap, s); + vsnprintf(p, n + 1, s, ap); + va_end(ap); + return p; } uint32_t @@ -443,7 +450,7 @@ newtmp(char *prfx, int k, Fn *fn) vgrow(&fn->tmp, fn->ntmp); memset(&fn->tmp[t], 0, sizeof(Tmp)); if (prfx) - strf(fn->tmp[t].name, "%s.%d", prfx, ++n); + fn->tmp[t].name = strf("%s.%d", prfx, ++n); fn->tmp[t].cls = k; fn->tmp[t].slot = -1; fn->tmp[t].nuse = +1;