]> Cypherpunks repositories - gostls13.git/commitdiff
gc, ld: tag data as no-pointers and allocate in separate section
authorRuss Cox <rsc@golang.org>
Sun, 19 Feb 2012 08:19:52 +0000 (03:19 -0500)
committerRuss Cox <rsc@golang.org>
Sun, 19 Feb 2012 08:19:52 +0000 (03:19 -0500)
The garbage collector can avoid scanning this section, with
reduces collection time as well as the number of false positives.
Helps a little bit with issue 909, but certainly does not solve it.

R=ken2
CC=golang-dev
https://golang.org/cl/5671099

12 files changed:
src/cmd/5g/gsubr.c
src/cmd/5l/5.out.h
src/cmd/5l/obj.c
src/cmd/6g/gsubr.c
src/cmd/6l/6.out.h
src/cmd/6l/obj.c
src/cmd/8g/gsubr.c
src/cmd/8l/8.out.h
src/cmd/8l/obj.c
src/cmd/ld/data.c
src/cmd/ld/lib.h
src/cmd/ld/symtab.c

index c938f8b00bd20834109aae5397d1c72a5a75abd2..61c91b8273c2c7657f3224cc41039c14c117aeb7 100644 (file)
@@ -253,6 +253,10 @@ ggloblnod(Node *nam, int32 width)
        p->to.sym = S;
        p->to.type = D_CONST;
        p->to.offset = width;
+       if(nam->readonly)
+               p->from.scale = RODATA;
+       if(nam->type != T && !haspointers(nam->type))
+               p->from.scale |= NOPTR;
 }
 
 void
index cf86ae48b8acdd6e5d4bae3d15ceaac36aa1bf21..569536ebd7be8c0d2a4620e46d4914051f82a3f5 100644 (file)
@@ -35,7 +35,8 @@
 #define NOPROF         (1<<0)
 #define DUPOK          (1<<1)
 #define NOSPLIT                (1<<2)
-#define        ALLTHUMBS       (1<<3)
+#define RODATA (1<<3)
+#define NOPTR  (1<<4)
 
 #define        REGRET          0
 /* -1 disables use of REGARG */
index 4a3db99b0017d183218c9ccd01f874514f633acf..f395925e15eb97c282975397dfa8e72c38a5de86 100644 (file)
@@ -540,7 +540,7 @@ loop:
                        s->type = SBSS;
                        s->value = 0;
                }
-               if(s->type != SBSS && !s->dupok) {
+               if(s->type != SBSS && s->type != SNOPTRDATA && !s->dupok) {
                        diag("redefinition: %s\n%P", s->name, p);
                        s->type = SBSS;
                        s->value = 0;
@@ -549,6 +549,10 @@ loop:
                        s->size = p->to.offset;
                if(p->reg & DUPOK)
                        s->dupok = 1;
+               if(p->from.scale & RODATA)
+                       s->type = SRODATA;
+               else if(p->from.scale & NOPTR)
+                       s->type = SNOPTRDATA;
                break;
 
        case ADATA:
index 2fea7daab800f3395207aa7495d13190411cfdf7..ededcf67327d06c21944767b186e8f6641bf269b 100644 (file)
@@ -231,6 +231,8 @@ ggloblnod(Node *nam, int32 width)
        p->to.offset = width;
        if(nam->readonly)
                p->from.scale = RODATA;
+       if(nam->type != T && !haspointers(nam->type))
+               p->from.scale |= NOPTR;
 }
 
 void
index 9a69c8ad525b147addb6b12454a9734c08439565..559cdc758b2b5f3d266623b6fe71938443e52359 100644 (file)
@@ -34,6 +34,7 @@
 #define DUPOK  (1<<1)
 #define NOSPLIT        (1<<2)
 #define RODATA (1<<3)
+#define NOPTR  (1<<4)
 
 /*
  *     amd64
index 5305c4b7971cfbdf85c80cf086afe7cde15b756c..19f85f059e139972b1eb210c43049675471ef14b 100644 (file)
@@ -555,7 +555,7 @@ loop:
                        s->type = SBSS;
                        s->size = 0;
                }
-               if(s->type != SBSS && !s->dupok) {
+               if(s->type != SBSS && s->type != SNOPTRDATA && !s->dupok) {
                        diag("%s: redefinition: %s in %s",
                                pn, s->name, TNAME);
                        s->type = SBSS;
@@ -567,6 +567,8 @@ loop:
                        s->dupok = 1;
                if(p->from.scale & RODATA)
                        s->type = SRODATA;
+               else if(p->from.scale & NOPTR)
+                       s->type = SNOPTRDATA;
                goto loop;
 
        case ADATA:
index 9cf36459657c2d5d569b142b53fa8d8b27fc831e..5e89af04ab2b0365c928944ee362346cb7da93cc 100644 (file)
@@ -232,6 +232,8 @@ ggloblnod(Node *nam, int32 width)
        p->to.offset = width;
        if(nam->readonly)
                p->from.scale = RODATA;
+       if(nam->type != T && !haspointers(nam->type))
+               p->from.scale |= NOPTR;
 }
 
 void
index 066192ef478eb75ff80083661513ac99d17d4d74..9d2751cf0a97473af5588da19704c0b47188107d 100644 (file)
@@ -34,6 +34,7 @@
 #define DUPOK  (1<<1)
 #define NOSPLIT        (1<<2)
 #define RODATA (1<<3)
+#define NOPTR  (1<<4)
 
 enum   as
 {
index affdb57b7be029d1bf31f40d48ff1b0bdb2ca5e1..ccb4f7c23ab832dcff9e34f195bbf02f32994a19 100644 (file)
@@ -563,7 +563,7 @@ loop:
                        s->type = SBSS;
                        s->size = 0;
                }
-               if(s->type != SBSS && !s->dupok) {
+               if(s->type != SBSS && s->type != SNOPTRDATA && !s->dupok) {
                        diag("%s: redefinition: %s in %s",
                                pn, s->name, TNAME);
                        s->type = SBSS;
@@ -575,6 +575,8 @@ loop:
                        s->dupok = 1;
                if(p->from.scale & RODATA)
                        s->type = SRODATA;
+               else if(p->from.scale & NOPTR)
+                       s->type = SNOPTRDATA;
                goto loop;
 
        case ADATA:
index b5f1b99312c6b62ee713369b62501d8c29250ab9..e5e1db6d6e980d9a849f76ffe5e7b96e2107d83c 100644 (file)
@@ -615,7 +615,7 @@ addstring(Sym *s, char *str)
        int32 r;
 
        if(s->type == 0)
-               s->type = SDATA;
+               s->type = SNOPTRDATA;
        s->reachable = 1;
        r = s->size;
        n = strlen(str)+1;
@@ -782,7 +782,7 @@ void
 dodata(void)
 {
        int32 t, datsize;
-       Section *sect;
+       Section *sect, *noptr;
        Sym *s, *last, **l;
 
        if(debug['v'])
@@ -887,7 +887,7 @@ dodata(void)
 
        /* writable ELF sections */
        datsize = 0;
-       for(; s != nil && s->type < SDATA; s = s->next) {
+       for(; s != nil && s->type < SNOPTRDATA; s = s->next) {
                sect = addsection(&segdata, s->name, 06);
                if(s->align != 0)
                        datsize = rnd(datsize, s->align);
@@ -897,17 +897,26 @@ dodata(void)
                datsize += rnd(s->size, PtrSize);
                sect->len = datsize - sect->vaddr;
        }
-
-       /* data */
-       sect = addsection(&segdata, ".data", 06);
+       
+       /* pointer-free data, then data */
+       sect = addsection(&segdata, ".noptrdata", 06);
        sect->vaddr = datsize;
-       for(; s != nil && s->type < SBSS; s = s->next) {
+       noptr = sect;
+       for(; ; s = s->next) {
+               if((s == nil || s->type >= SDATA) && sect == noptr) {
+                       // finish noptrdata, start data
+                       datsize = rnd(datsize, 8);
+                       sect->len = datsize - sect->vaddr;
+                       sect = addsection(&segdata, ".data", 06);
+                       sect->vaddr = datsize;
+               }
+               if(s == nil || s->type >= SBSS) {
+                       // finish data
+                       sect->len = datsize - sect->vaddr;
+                       break;
+               }
                s->type = SDATA;
                t = s->size;
-               if(t == 0 && s->name[0] != '.') {
-                       diag("%s: no size", s->name);
-                       t = 1;
-               }
                if(t >= PtrSize)
                        t = rnd(t, PtrSize);
                else if(t > 2)
@@ -925,7 +934,6 @@ dodata(void)
                s->value = datsize;
                datsize += t;
        }
-       sect->len = datsize - sect->vaddr;
 
        /* bss */
        sect = addsection(&segdata, ".bss", 06);
@@ -996,7 +1004,7 @@ textaddress(void)
 void
 address(void)
 {
-       Section *s, *text, *data, *rodata, *symtab, *pclntab;
+       Section *s, *text, *data, *rodata, *symtab, *pclntab, *noptr;
        Sym *sym, *sub;
        uvlong va;
 
@@ -1022,6 +1030,7 @@ address(void)
        if(HEADTYPE == Hplan9x32)
                segdata.fileoff = segtext.fileoff + segtext.filelen;
        data = nil;
+       noptr = nil;
        for(s=segdata.sect; s != nil; s=s->next) {
                s->vaddr = va;
                va += s->len;
@@ -1029,6 +1038,8 @@ address(void)
                segdata.len = va - segdata.vaddr;
                if(strcmp(s->name, ".data") == 0)
                        data = s;
+               if(strcmp(s->name, ".noptrdata") == 0)
+                       noptr = s;
        }
        segdata.filelen -= data->next->len; // deduct .bss
 
@@ -1039,7 +1050,7 @@ address(void)
 
        for(sym = datap; sym != nil; sym = sym->next) {
                cursym = sym;
-               if(sym->type < SDATA)
+               if(sym->type < SNOPTRDATA)
                        sym->value += rodata->vaddr;
                else
                        sym->value += segdata.sect->vaddr;
@@ -1055,6 +1066,8 @@ address(void)
        xdefine("esymtab", SRODATA, symtab->vaddr + symtab->len);
        xdefine("pclntab", SRODATA, pclntab->vaddr);
        xdefine("epclntab", SRODATA, pclntab->vaddr + pclntab->len);
+       xdefine("noptrdata", SBSS, noptr->vaddr);
+       xdefine("enoptrdata", SBSS, noptr->vaddr + noptr->len);
        xdefine("data", SBSS, data->vaddr);
        xdefine("edata", SBSS, data->vaddr + data->len);
        xdefine("end", SBSS, segdata.vaddr + segdata.len);
index 188ff9f928767bbc250ac23a4584134bec9bc3df..a66a571c215da2c2143591480679fc1c8aa08e12 100644 (file)
@@ -43,6 +43,7 @@ enum
        SPCLNTAB,
        SELFROSECT,
        SELFSECT,
+       SNOPTRDATA,
        SDATA,
        SMACHO, /* Mach-O __nl_symbol_ptr */
        SMACHOGOT,
index 00413af0094710bcdb425e38e8a18722e3cefb14..d89359958e4139d1f9e7b769dc86bee045fa0ad5 100644 (file)
@@ -330,6 +330,8 @@ symtab(void)
        xdefine("etext", STEXT, 0);
        xdefine("rodata", SRODATA, 0);
        xdefine("erodata", SRODATA, 0);
+       xdefine("noptrdata", SBSS, 0);
+       xdefine("enoptrdata", SBSS, 0);
        xdefine("data", SBSS, 0);
        xdefine("edata", SBSS, 0);
        xdefine("end", SBSS, 0);