diff options
| author | Carl Shapiro <cshapiro@google.com> | 2013-05-28 17:59:10 -0700 |
|---|---|---|
| committer | Carl Shapiro <cshapiro@google.com> | 2013-05-28 17:59:10 -0700 |
| commit | 4e0a51c210ededa82809756ca1cc72b1fb1def8d (patch) | |
| tree | 73e39d7d22cc17088ea10bcd2bc0ce165b45ef0d /src/cmd/5l/obj.c | |
| parent | 8bbb08533dab0dcf627db0b76ba65c3fb9b1d682 (diff) | |
| download | go-4e0a51c210ededa82809756ca1cc72b1fb1def8d.tar.xz | |
cmd/5l, cmd/6l, cmd/8l, cmd/gc, runtime: generate and use bitmaps of argument pointer locations
With this change the compiler emits a bitmap for each function
covering its stack frame arguments area. If an argument word
is known to contain a pointer, a bit is set. The garbage
collector reads this information when scanning the stack by
frames and uses it to ignores locations known to not contain a
pointer.
R=golang-dev, bradfitz, daniel.morsing, dvyukov, khr, khr, iant, cshapiro
CC=golang-dev
https://golang.org/cl/9223046
Diffstat (limited to 'src/cmd/5l/obj.c')
| -rw-r--r-- | src/cmd/5l/obj.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/cmd/5l/obj.c b/src/cmd/5l/obj.c index 24e6294a84..47831e39c6 100644 --- a/src/cmd/5l/obj.c +++ b/src/cmd/5l/obj.c @@ -627,6 +627,38 @@ loop: pc++; goto loop; + case ANPTRS: + if(skip) + goto casedef; + if(cursym->nptrs != -1) { + diag("ldobj1: multiple pointer maps defined for %s", cursym->name); + errorexit(); + } + if(p->to.offset > cursym->args/PtrSize) { + diag("ldobj1: pointer map definition for %s exceeds its argument size", cursym->name); + errorexit(); + } + cursym->nptrs = p->to.offset; + if(cursym->nptrs != 0) + cursym->ptrs = mal((rnd(cursym->nptrs, 32) / 32) * sizeof(*cursym->ptrs)); + pc++; + goto loop; + + case APTRS: + if(skip) + goto casedef; + if(cursym->nptrs == -1 || cursym->ptrs == NULL) { + diag("ldobj1: pointer map data provided for %s without a definition", cursym->name); + errorexit(); + } + if(p->from.offset*32 >= rnd(cursym->nptrs, 32)) { + diag("ldobj1: excessive pointer map data provided for %s", cursym->name); + errorexit(); + } + cursym->ptrs[p->from.offset] = p->to.offset; + pc++; + goto loop; + case ATEXT: if(cursym != nil && cursym->text) { histtoauto(); @@ -670,6 +702,7 @@ loop: s->text = p; s->value = pc; s->args = p->to.offset2; + s->nptrs = -1; lastp = p; p->pc = pc; pc++; |
