]> Cypherpunks repositories - gostls13.git/commitdiff
dupok, gcc compile fix, sync and syscall asm fix
authorKai Backman <kaib@golang.org>
Fri, 9 Oct 2009 05:16:08 +0000 (22:16 -0700)
committerKai Backman <kaib@golang.org>
Fri, 9 Oct 2009 05:16:08 +0000 (22:16 -0700)
R=rsc
APPROVED=rsc
DELTA=27  (18 added, 0 deleted, 9 changed)
OCL=35503
CL=35505

src/cmd/5l/l.h
src/cmd/5l/obj.c
src/cmd/ld/lib.c
src/pkg/syscall/asm_linux_arm.s

index 09fbda8c21a992a48fcc890aaec0224bd785abc8..05a20bad367c4c29f4ce18ea9c138d623179dc35 100644 (file)
@@ -123,6 +123,7 @@ struct      Sym
        short   become;
        short   frame;
        uchar   subtype;
+       uchar   dupok;
        uchar   reachable;
        int32   value;
        int32   sig;
index 574d506487ef67dfac1a1cd3edc8c8d5db7f0eb6..45751e8c5eeec3b98fbef1f30fa13da712d8c018 100644 (file)
@@ -564,6 +564,8 @@ loop:
                }
                if(p->to.offset > s->value)
                        s->value = p->to.offset;
+               if(p->reg & DUPOK)
+                       s->dupok = 1;
                break;
 
        case ADYNT:
@@ -627,10 +629,15 @@ loop:
                break;
 
        case ADATA:
+               // Assume that AGLOBL comes after ADATA.
+               // If we've seen an AGLOBL that said this sym was DUPOK,
+               // ignore any more ADATA we see, which must be
+               // redefinitions.
                s = p->from.sym;
-               if(s == S) {
-                       diag("DATA without a sym\n%P", p);
-                       break;
+               if(s != S && s->dupok) {
+                       if(debug['v'])
+                               Bprint(&bso, "skipping %s in %s: dupok\n", s->name, pn);
+                       goto loop;
                }
                if(s != S) {
                        p->dlink = s->data;
index 0ca165417c8a5077e20db8c04e188f5c277f80c9..208a55b44149c757ca2fa55c3dfa8553725d1b5a 100644 (file)
@@ -561,10 +561,15 @@ find1(int32 l, int c)
 int
 find2(int32 l, int c)
 {
+       union {
+               int32 l;
+               short p[2];
+       } u;
        short *p;
        int i;
 
-       p = (short*)&l;
+       u.l = l;
+       p = u.p;
        for(i=0; i<4; i+=2) {
                if(((*p >> 8) & 0xff) == c)
                        return i;
index f7153d5493756ebfd1445a84c7a65e7643964662..8aa5f348cb3343be1d678418a4c4345d09b2b870 100644 (file)
@@ -22,7 +22,8 @@ TEXT  syscall·Syscall(SB),7,$0
        SWI             $SYS_syscall
        MOVW    R0, 20(SP)      // r1
        MOVW    R1, 24(SP)      // r2
-       MOVW    $0, 28(SP)      // errno
+       MOVW    $0, R0
+       MOVW    R0, 28(SP)      // errno
        BL              sys·exitsyscall(SB)
        RET
 
@@ -40,7 +41,8 @@ TEXT  syscall·Syscall6(SB),7,$0
        SWI             $SYS_syscall
        MOVW    R0, 32(SP)      // r1
        MOVW    R1, 36(SP)      // r2
-       MOVW    $0, 40(SP)      // errno
+       MOVW    $0, R0
+       MOVW    R0, 40(SP)      // errno
        BL              sys·exitsyscall(SB)
        RET
 
@@ -53,5 +55,6 @@ TEXT syscall·RawSyscall(SB),7,$0
        SWI             $SYS_syscall
        MOVW    R0, 20(SP)      // r1
        MOVW    R1, 24(SP)      // r2
-       MOVW    $0, 28(SP)      // errno
+       MOVW    $0, R0
+       MOVW    R0, 28(SP)      // errno
        RET