Commit ac1b9545 authored by Luuk van Dijk's avatar Luuk van Dijk

ld: grow dwarf includestack on demand.

Fixes #2241
while not breaking issue 1878 again.

R=rsc
CC=golang-dev
https://golang.org/cl/4988048
parent 3301e5a4
...@@ -125,7 +125,6 @@ static void ...@@ -125,7 +125,6 @@ static void
outhist(Biobuf *b) outhist(Biobuf *b)
{ {
Hist *h; Hist *h;
int i, depth = 0;
char *p, ds[] = {'c', ':', '/', 0}; char *p, ds[] = {'c', ':', '/', 0};
for(h = hist; h != H; h = h->link) { for(h = hist; h != H; h = h->link) {
...@@ -162,14 +161,7 @@ outhist(Biobuf *b) ...@@ -162,14 +161,7 @@ outhist(Biobuf *b)
outzfile(b, p); outzfile(b, p);
} }
} }
if(h->offset > 0) {
//line directive
depth++;
}
} else if(depth > 0) {
for(i = 0; i < depth; i++)
zhist(b, h->line, h->offset);
depth = 0;
} }
zhist(b, h->line, h->offset); zhist(b, h->line, h->offset);
} }
......
...@@ -1578,13 +1578,16 @@ addhistfile(char *zentry) ...@@ -1578,13 +1578,16 @@ addhistfile(char *zentry)
histfile[histfilesize++] = "<eof>"; histfile[histfilesize++] = "<eof>";
fname = decodez(zentry); fname = decodez(zentry);
// print("addhistfile %d: %s\n", histfilesize, fname);
if (fname == 0) if (fname == 0)
return -1; return -1;
// Don't fill with duplicates (check only top one). // Don't fill with duplicates (check only top one).
if (strcmp(fname, histfile[histfilesize-1]) == 0) { if (strcmp(fname, histfile[histfilesize-1]) == 0) {
free(fname); free(fname);
return histfilesize - 1; return histfilesize - 1;
} }
histfile[histfilesize++] = fname; histfile[histfilesize++] = fname;
return histfilesize - 1; return histfilesize - 1;
} }
...@@ -1608,11 +1611,13 @@ finddebugruntimepath(void) ...@@ -1608,11 +1611,13 @@ finddebugruntimepath(void)
} }
// Go's runtime C sources are sane, and Go sources nest only 1 level, // Go's runtime C sources are sane, and Go sources nest only 1 level,
// so 16 should be plenty. // so a handful would be plenty, if it weren't for the fact that line
// directives can push an unlimited number of them.
static struct { static struct {
int file; int file;
vlong line; vlong line;
} includestack[16]; } *includestack;
static int includestacksize;
static int includetop; static int includetop;
static vlong absline; static vlong absline;
...@@ -1629,17 +1634,15 @@ static Linehist *linehist; ...@@ -1629,17 +1634,15 @@ static Linehist *linehist;
static void static void
checknesting(void) checknesting(void)
{ {
int i;
if (includetop < 0) { if (includetop < 0) {
diag("dwarf: corrupt z stack"); diag("dwarf: corrupt z stack");
errorexit(); errorexit();
} }
if (includetop >= nelem(includestack)) { if (includetop >= includestacksize) {
diag("dwarf: nesting too deep"); includestacksize += 1;
for (i = 0; i < nelem(includestack); i++) includestacksize <<= 2;
diag("\t%s", histfile[includestack[i].file]); // print("checknesting: growing to %d\n", includestacksize);
errorexit(); includestack = realloc(includestack, includestacksize * sizeof *includestack);
} }
} }
...@@ -1669,6 +1672,7 @@ inithist(Auto *a) ...@@ -1669,6 +1672,7 @@ inithist(Auto *a)
// Clear the history. // Clear the history.
clearhistfile(); clearhistfile();
includetop = 0; includetop = 0;
checknesting();
includestack[includetop].file = 0; includestack[includetop].file = 0;
includestack[includetop].line = -1; includestack[includetop].line = -1;
absline = 0; absline = 0;
...@@ -1682,10 +1686,10 @@ inithist(Auto *a) ...@@ -1682,10 +1686,10 @@ inithist(Auto *a)
for (; a; a = a->link) { for (; a; a = a->link) {
if (a->type == D_FILE) { // 'z' if (a->type == D_FILE) { // 'z'
int f = addhistfile(a->asym->name); int f = addhistfile(a->asym->name);
if (f < 0) { // pop file if (f < 0) { // pop file
includetop--; includetop--;
checknesting(); checknesting();
} else if(f != includestack[includetop].file) { // pushed a new file } else { // pushed a file (potentially same)
includestack[includetop].line += a->aoffset - absline; includestack[includetop].line += a->aoffset - absline;
includetop++; includetop++;
checknesting(); checknesting();
......
// $G $D/$F.go && $L $F.$A && ./$A.out
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//line foo/bar.y:4
package main
//line foo/bar.y:60
func main() {
//line foo/bar.y:297
f, l := 0, 0
//line yacctab:1
f, l = 1, 1
//line yaccpar:1
f, l = 2, 1
//line foo/bar.y:82
f, l = 3, 82
//line foo/bar.y:90
f, l = 3, 90
//line foo/bar.y:92
f, l = 3, 92
//line foo/bar.y:100
f, l = 3, 100
//line foo/bar.y:104
l = 104
//line foo/bar.y:112
l = 112
//line foo/bar.y:117
l = 117
//line foo/bar.y:121
l = 121
//line foo/bar.y:125
l = 125
//line foo/bar.y:133
l = 133
//line foo/bar.y:146
l = 146
//line foo/bar.y:148
//line foo/bar.y:153
//line foo/bar.y:155
l = 155
//line foo/bar.y:160
//line foo/bar.y:164
//line foo/bar.y:173
//line foo/bar.y:178
//line foo/bar.y:180
//line foo/bar.y:185
//line foo/bar.y:195
//line foo/bar.y:197
//line foo/bar.y:202
//line foo/bar.y:204
//line foo/bar.y:208
//line foo/bar.y:211
//line foo/bar.y:213
//line foo/bar.y:215
//line foo/bar.y:217
//line foo/bar.y:221
//line foo/bar.y:229
//line foo/bar.y:236
//line foo/bar.y:238
//line foo/bar.y:240
//line foo/bar.y:244
//line foo/bar.y:249
//line foo/bar.y:253
//line foo/bar.y:257
//line foo/bar.y:262
//line foo/bar.y:267
//line foo/bar.y:272
if l == f {
//line foo/bar.y:277
panic("aie!")
//line foo/bar.y:281
}
//line foo/bar.y:285
return
//line foo/bar.y:288
//line foo/bar.y:290
}
//line foo/bar.y:293
//line foo/bar.y:295
// $G $D/$F.go $D/z*.go && $L $F.$A && ./$A.out
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
func main() {
F1()
F2()
F3()
F4()
F5()
F6()
F7()
F8()
F9()
F10()
F11()
F12()
F13()
F14()
F15()
F16()
F17()
F18()
F19()
F20()
}
//line x1.go:4
package main
func F1() {}
//line x10.go:4
package main
func F10() {}
//line x11.go:4
package main
func F11() {}
//line x12.go:4
package main
func F12() {}
//line x13.go:4
package main
func F13() {}
//line x14.go:4
package main
func F14() {}
//line x15.go:4
package main
func F15() {}
//line x16.go:4
package main
func F16() {}
//line x17.go:4
package main
func F17() {}
//line x18.go:4
package main
func F18() {}
//line x19.go:4
package main
func F19() {}
//line x2.go:4
package main
func F2() {}
//line x20.go:4
package main
func F20() {}
//line x3.go:4
package main
func F3() {}
//line x4.go:4
package main
func F4() {}
//line x5.go:4
package main
func F5() {}
//line x6.go:4
package main
func F6() {}
//line x7.go:4
package main
func F7() {}
//line x8.go:4
package main
func F8() {}
//line x9.go:4
package main
func F9() {}
...@@ -115,6 +115,8 @@ panic: interface conversion: *main.S is not main.I2: missing method Name ...@@ -115,6 +115,8 @@ panic: interface conversion: *main.S is not main.I2: missing method Name
== syntax/ == syntax/
== dwarf/
== fixedbugs/ == fixedbugs/
=========== fixedbugs/bug027.go =========== fixedbugs/bug027.go
......
...@@ -53,7 +53,7 @@ filterout() { ...@@ -53,7 +53,7 @@ filterout() {
grep '^'"$2"'$' $1 >/dev/null grep '^'"$2"'$' $1 >/dev/null
} }
for dir in . ken chan interface nilptr syntax fixedbugs bugs for dir in . ken chan interface nilptr syntax dwarf fixedbugs bugs
do do
echo echo
echo '==' $dir'/' echo '==' $dir'/'
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment