mirror of
https://github.com/golang/go
synced 2024-11-21 19:24:45 -07:00
ld: grow dwarf includestack on demand.
Fixes #2241 while not breaking issue 1878 again. R=rsc CC=golang-dev https://golang.org/cl/4988048
This commit is contained in:
parent
3301e5a4f5
commit
ac1b9545e3
@ -125,7 +125,6 @@ static void
|
||||
outhist(Biobuf *b)
|
||||
{
|
||||
Hist *h;
|
||||
int i, depth = 0;
|
||||
char *p, ds[] = {'c', ':', '/', 0};
|
||||
|
||||
for(h = hist; h != H; h = h->link) {
|
||||
@ -162,14 +161,7 @@ outhist(Biobuf *b)
|
||||
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);
|
||||
}
|
||||
|
@ -1578,13 +1578,16 @@ addhistfile(char *zentry)
|
||||
histfile[histfilesize++] = "<eof>";
|
||||
|
||||
fname = decodez(zentry);
|
||||
// print("addhistfile %d: %s\n", histfilesize, fname);
|
||||
if (fname == 0)
|
||||
return -1;
|
||||
|
||||
// Don't fill with duplicates (check only top one).
|
||||
if (strcmp(fname, histfile[histfilesize-1]) == 0) {
|
||||
free(fname);
|
||||
return histfilesize - 1;
|
||||
}
|
||||
|
||||
histfile[histfilesize++] = fname;
|
||||
return histfilesize - 1;
|
||||
}
|
||||
@ -1608,11 +1611,13 @@ finddebugruntimepath(void)
|
||||
}
|
||||
|
||||
// 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 {
|
||||
int file;
|
||||
vlong line;
|
||||
} includestack[16];
|
||||
} *includestack;
|
||||
static int includestacksize;
|
||||
static int includetop;
|
||||
static vlong absline;
|
||||
|
||||
@ -1629,17 +1634,15 @@ static Linehist *linehist;
|
||||
static void
|
||||
checknesting(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (includetop < 0) {
|
||||
diag("dwarf: corrupt z stack");
|
||||
errorexit();
|
||||
}
|
||||
if (includetop >= nelem(includestack)) {
|
||||
diag("dwarf: nesting too deep");
|
||||
for (i = 0; i < nelem(includestack); i++)
|
||||
diag("\t%s", histfile[includestack[i].file]);
|
||||
errorexit();
|
||||
if (includetop >= includestacksize) {
|
||||
includestacksize += 1;
|
||||
includestacksize <<= 2;
|
||||
// print("checknesting: growing to %d\n", includestacksize);
|
||||
includestack = realloc(includestack, includestacksize * sizeof *includestack);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1669,6 +1672,7 @@ inithist(Auto *a)
|
||||
// Clear the history.
|
||||
clearhistfile();
|
||||
includetop = 0;
|
||||
checknesting();
|
||||
includestack[includetop].file = 0;
|
||||
includestack[includetop].line = -1;
|
||||
absline = 0;
|
||||
@ -1685,7 +1689,7 @@ inithist(Auto *a)
|
||||
if (f < 0) { // pop file
|
||||
includetop--;
|
||||
checknesting();
|
||||
} else if(f != includestack[includetop].file) { // pushed a new file
|
||||
} else { // pushed a file (potentially same)
|
||||
includestack[includetop].line += a->aoffset - absline;
|
||||
includetop++;
|
||||
checknesting();
|
||||
|
83
test/dwarf/linedirectives.go
Executable file
83
test/dwarf/linedirectives.go
Executable file
@ -0,0 +1,83 @@
|
||||
// $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
|
29
test/dwarf/main.go
Normal file
29
test/dwarf/main.go
Normal file
@ -0,0 +1,29 @@
|
||||
// $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()
|
||||
}
|
5
test/dwarf/z1.go
Normal file
5
test/dwarf/z1.go
Normal file
@ -0,0 +1,5 @@
|
||||
|
||||
|
||||
//line x1.go:4
|
||||
package main
|
||||
func F1() {}
|
6
test/dwarf/z10.go
Normal file
6
test/dwarf/z10.go
Normal file
@ -0,0 +1,6 @@
|
||||
|
||||
|
||||
|
||||
//line x10.go:4
|
||||
package main
|
||||
func F10() {}
|
4
test/dwarf/z11.go
Normal file
4
test/dwarf/z11.go
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
//line x11.go:4
|
||||
package main
|
||||
func F11() {}
|
4
test/dwarf/z12.go
Normal file
4
test/dwarf/z12.go
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
//line x12.go:4
|
||||
package main
|
||||
func F12() {}
|
4
test/dwarf/z13.go
Normal file
4
test/dwarf/z13.go
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
//line x13.go:4
|
||||
package main
|
||||
func F13() {}
|
4
test/dwarf/z14.go
Normal file
4
test/dwarf/z14.go
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
//line x14.go:4
|
||||
package main
|
||||
func F14() {}
|
4
test/dwarf/z15.go
Normal file
4
test/dwarf/z15.go
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
//line x15.go:4
|
||||
package main
|
||||
func F15() {}
|
4
test/dwarf/z16.go
Normal file
4
test/dwarf/z16.go
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
//line x16.go:4
|
||||
package main
|
||||
func F16() {}
|
4
test/dwarf/z17.go
Normal file
4
test/dwarf/z17.go
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
//line x17.go:4
|
||||
package main
|
||||
func F17() {}
|
5
test/dwarf/z18.go
Normal file
5
test/dwarf/z18.go
Normal file
@ -0,0 +1,5 @@
|
||||
|
||||
|
||||
//line x18.go:4
|
||||
package main
|
||||
func F18() {}
|
4
test/dwarf/z19.go
Normal file
4
test/dwarf/z19.go
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
//line x19.go:4
|
||||
package main
|
||||
func F19() {}
|
4
test/dwarf/z2.go
Normal file
4
test/dwarf/z2.go
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
//line x2.go:4
|
||||
package main
|
||||
func F2() {}
|
4
test/dwarf/z20.go
Normal file
4
test/dwarf/z20.go
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
//line x20.go:4
|
||||
package main
|
||||
func F20() {}
|
4
test/dwarf/z3.go
Normal file
4
test/dwarf/z3.go
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
//line x3.go:4
|
||||
package main
|
||||
func F3() {}
|
4
test/dwarf/z4.go
Normal file
4
test/dwarf/z4.go
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
//line x4.go:4
|
||||
package main
|
||||
func F4() {}
|
4
test/dwarf/z5.go
Normal file
4
test/dwarf/z5.go
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
//line x5.go:4
|
||||
package main
|
||||
func F5() {}
|
4
test/dwarf/z6.go
Normal file
4
test/dwarf/z6.go
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
//line x6.go:4
|
||||
package main
|
||||
func F6() {}
|
4
test/dwarf/z7.go
Normal file
4
test/dwarf/z7.go
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
//line x7.go:4
|
||||
package main
|
||||
func F7() {}
|
4
test/dwarf/z8.go
Normal file
4
test/dwarf/z8.go
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
//line x8.go:4
|
||||
package main
|
||||
func F8() {}
|
4
test/dwarf/z9.go
Normal file
4
test/dwarf/z9.go
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
//line x9.go:4
|
||||
package main
|
||||
func F9() {}
|
@ -115,6 +115,8 @@ panic: interface conversion: *main.S is not main.I2: missing method Name
|
||||
|
||||
== syntax/
|
||||
|
||||
== dwarf/
|
||||
|
||||
== fixedbugs/
|
||||
|
||||
=========== fixedbugs/bug027.go
|
||||
|
Loading…
Reference in New Issue
Block a user