diff options
author | Dmitriy Vyukov <dvyukov@google.com> | 2014-07-29 11:01:02 +0400 |
---|---|---|
committer | Dmitriy Vyukov <dvyukov@google.com> | 2014-07-29 11:01:02 +0400 |
commit | 426772a95d353d6ef24475e0c7ec2d4591d080ae (patch) | |
tree | aafdd54d31f1df5f311ac476ae77927d6573856d /src/cmd/ld/decodesym.c | |
parent | 670466819fb227cda4ca8f8c1f4f3ce539ebfefd (diff) | |
download | go-426772a95d353d6ef24475e0c7ec2d4591d080ae.tar.gz |
runtime: simpler and faster GC
Implement the design described in:
https://docs.google.com/document/d/1v4Oqa0WwHunqlb8C3ObL_uNQw3DfSY-ztoA-4wWbKcg/pub
Summary of the changes:
GC uses "2-bits per word" pointer type info embed directly into bitmap.
Scanning of stacks/data/heap is unified.
The old spans types go away.
Compiler generates "sparse" 4-bits type info for GC (directly for GC bitmap).
Linker generates "dense" 2-bits type info for data/bss (the same as stacks use).
Summary of results:
-1680 lines of code total (-1000+ in mgc0.c only)
-25% memory consumption
-3-7% binary size
-15% GC pause reduction
-7% run time reduction
LGTM=khr
R=golang-codereviews, rsc, christoph, khr
CC=golang-codereviews, rlh
https://codereview.appspot.com/106260045
Diffstat (limited to 'src/cmd/ld/decodesym.c')
-rw-r--r-- | src/cmd/ld/decodesym.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/src/cmd/ld/decodesym.c b/src/cmd/ld/decodesym.c index 1773387f5..b5fe47ce9 100644 --- a/src/cmd/ld/decodesym.c +++ b/src/cmd/ld/decodesym.c @@ -70,14 +70,28 @@ decode_inuxi(uchar* p, int sz) static int commonsize(void) { - return 7*PtrSize + 8; + return 8*PtrSize + 8; } // Type.commonType.kind uint8 decodetype_kind(LSym *s) { - return s->p[1*PtrSize + 7] & ~KindNoPointers; // 0x13 / 0x1f + return s->p[1*PtrSize + 7] & KindMask; // 0x13 / 0x1f +} + +// Type.commonType.kind +uint8 +decodetype_noptr(LSym *s) +{ + return s->p[1*PtrSize + 7] & KindNoPointers; // 0x13 / 0x1f +} + +// Type.commonType.kind +uint8 +decodetype_usegcprog(LSym *s) +{ + return s->p[1*PtrSize + 7] & KindGCProg; // 0x13 / 0x1f } // Type.commonType.size @@ -89,9 +103,15 @@ decodetype_size(LSym *s) // Type.commonType.gc LSym* -decodetype_gc(LSym *s) +decodetype_gcprog(LSym *s) +{ + return decode_reloc_sym(s, 1*PtrSize + 8 + 2*PtrSize); +} + +uint8* +decodetype_gcmask(LSym *s) { - return decode_reloc_sym(s, 1*PtrSize + 8 + 1*PtrSize); + return (uint8*)(s->p + 1*PtrSize + 8 + 1*PtrSize); } // Type.ArrayType.elem and Type.SliceType.Elem |