]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/6l: Fixes for 64-bit Plan 9
authorAkshat Kumar <seed@mail.nanosouffle.net>
Tue, 29 May 2012 16:32:42 +0000 (12:32 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 29 May 2012 16:32:42 +0000 (12:32 -0400)
Plan 9 versions for amd64 have 2 megabyte pages.
This also fixes the logic for 32-bit vs 64-bit Plan 9,
making 64-bit the default, and adds logic to generate
a symbols table.

R=golang-dev, rsc, rminnich, ality, 0intro
CC=golang-dev, john
https://golang.org/cl/6218046

src/cmd/6l/asm.c
src/cmd/6l/obj.c
src/cmd/ld/data.c
src/cmd/ld/symtab.c

index 7939b10e30f248a9cab59cf0335efd6cc852fe29..8d8c6d725c04b6c9197feef6b2bab539ba1363b6 100644 (file)
@@ -715,7 +715,8 @@ asmb(void)
        ElfPhdr *ph, *pph;
        ElfShdr *sh;
        Section *sect;
-       int o;
+       Sym *sym;
+       int i, o;
 
        if(debug['v'])
                Bprint(&bso, "%5.2f asmb\n", cputime());
@@ -763,6 +764,7 @@ asmb(void)
        default:
                diag("unknown header type %d", HEADTYPE);
        case Hplan9x32:
+       case Hplan9x64:
        case Helf:
                break;
        case Hdarwin:
@@ -798,7 +800,7 @@ asmb(void)
                Bflush(&bso);
                switch(HEADTYPE) {
                default:
-               case Hplan9x32:
+               case Hplan9x64:
                case Helf:
                        debug['s'] = 1;
                        symo = HEADR+segtext.len+segdata.filelen;
@@ -833,6 +835,19 @@ asmb(void)
                                dwarfemitdebugsections();
                        }
                        break;
+               case Hplan9x64:
+                       asmplan9sym();
+                       cflush();
+
+                       sym = lookup("pclntab", 0);
+                       if(sym != nil) {
+                               lcsize = sym->np;
+                               for(i=0; i < lcsize; i++)
+                                       cput(sym->p[i]);
+                               
+                               cflush();
+                       }
+                       break;
                case Hwindows:
                        if(debug['v'])
                               Bprint(&bso, "%5.2f dwarf\n", cputime());
@@ -848,7 +863,7 @@ asmb(void)
        cseek(0L);
        switch(HEADTYPE) {
        default:
-       case Hplan9x32: /* plan9 */
+       case Hplan9x64: /* plan9 */
                magic = 4*26*26+7;
                magic |= 0x00008000;            /* fat header */
                lputb(magic);                   /* magic */
@@ -862,7 +877,7 @@ asmb(void)
                lputb(lcsize);                  /* line offsets */
                vputb(vl);                      /* va of entry */
                break;
-       case Hplan9x64: /* plan9 */
+       case Hplan9x32: /* plan9 */
                magic = 4*26*26+7;
                lputb(magic);                   /* magic */
                lputb(segtext.filelen);         /* sizes */
index 64d1730842daed03dcfc899cacb704debd37e150..cfce2111b824a3c573f6c5ba9251d8f0911d60f0 100644 (file)
@@ -58,8 +58,8 @@ Header headers[] = {
 };
 
 /*
- *     -Hplan9x32 -T4136 -R4096        is plan9 64-bit format
- *     -Hplan9 -T4128 -R4096           is plan9 32-bit format
+ *     -Hplan9x32 -T4128 -R4096        is plan9 32-bit format
+ *     -Hplan9 -T0x200028 -R0x200000   is plan9 64-bit format
  *     -Helf -T0x80110000 -R4096       is ELF32
  *     -Hdarwin -Tx -Rx                is apple MH-exec
  *     -Hlinux -Tx -Rx                 is linux elf-exec
@@ -164,7 +164,7 @@ main(int argc, char *argv[])
                diag("unknown -H option");
                errorexit();
        case Hplan9x32: /* plan 9 */
-               HEADR = 32L+8L;
+               HEADR = 32L;
                if(INITTEXT == -1)
                        INITTEXT = 4096+HEADR;
                if(INITDAT == -1)
@@ -173,13 +173,13 @@ main(int argc, char *argv[])
                        INITRND = 4096;
                break;
        case Hplan9x64: /* plan 9 */
-               HEADR = 32L;
+               HEADR = 32L + 8L;
                if(INITTEXT == -1)
-                       INITTEXT = 4096+32;
+                       INITTEXT = 0x200000+HEADR;
                if(INITDAT == -1)
                        INITDAT = 0;
                if(INITRND == -1)
-                       INITRND = 4096;
+                       INITRND = 0x200000;
                break;
        case Helf:      /* elf32 executable */
                HEADR = rnd(52L+3*32L, 16);
index 4eff24024e62a63f23a0b3c0eb5c4aaf9fe8b1f0..1f64a84708d30034564d2f8fee19f5c1d3b87e8c 100644 (file)
@@ -1058,7 +1058,7 @@ address(void)
        segdata.filelen = 0;
        if(HEADTYPE == Hwindows)
                segdata.fileoff = segtext.fileoff + rnd(segtext.len, PEFILEALIGN);
-       if(HEADTYPE == Hplan9x32)
+       if(HEADTYPE == Hplan9x64 || HEADTYPE == Hplan9x32)
                segdata.fileoff = segtext.fileoff + segtext.filelen;
        data = nil;
        noptr = nil;
index 359a658e74e719368999cd9ff1a9adbca27e590a..c43051a39210dfbf2b756ded5f83983e5d4bbe31 100644 (file)
@@ -125,7 +125,7 @@ asmelfsym(void)
 static void
 putplan9sym(Sym *x, char *s, int t, vlong addr, vlong size, int ver, Sym *go)
 {
-       int i;
+       int i, l;
 
        USED(go);
        USED(ver);
@@ -144,6 +144,11 @@ putplan9sym(Sym *x, char *s, int t, vlong addr, vlong size, int ver, Sym *go)
        case 'z':
        case 'Z':
        case 'm':
+               l = 4;
+               if(HEADTYPE == Hplan9x64 && !debug['8']) {
+                       lputb(addr>>32);
+                       l = 8;
+               }
                lputb(addr);
                cput(t+0x80); /* 0x80 is variable length */
 
@@ -164,7 +169,7 @@ putplan9sym(Sym *x, char *s, int t, vlong addr, vlong size, int ver, Sym *go)
                                cput(s[i]);
                        cput(0);
                }
-               symsize += 4 + 1 + i + 1;
+               symsize += l + 1 + i + 1;
                break;
        default:
                return;