mirror of
https://github.com/golang/go
synced 2024-11-21 19:14:44 -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)
|
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 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;
|
|||||||
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)
|
|||||||
// 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)
|
|||||||
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();
|
||||||
|
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/
|
== syntax/
|
||||||
|
|
||||||
|
== dwarf/
|
||||||
|
|
||||||
== fixedbugs/
|
== fixedbugs/
|
||||||
|
|
||||||
=========== fixedbugs/bug027.go
|
=========== fixedbugs/bug027.go
|
||||||
|
Loading…
Reference in New Issue
Block a user