summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Backman <kaib@golang.org>2009-10-08 22:16:08 -0700
committerKai Backman <kaib@golang.org>2009-10-08 22:16:08 -0700
commita9ff8658ca3de13061e9cd75c4a42f0824f9b3e0 (patch)
tree3a314f5abb1e8808819fe3a5aed7320565db27bd
parent40d962031ed3681065c185cd5b38fdb12dd44c2e (diff)
downloadgolang-a9ff8658ca3de13061e9cd75c4a42f0824f9b3e0.tar.gz
dupok, gcc compile fix, sync and syscall asm fix
R=rsc APPROVED=rsc DELTA=27 (18 added, 0 deleted, 9 changed) OCL=35503 CL=35505
-rw-r--r--src/cmd/5l/l.h1
-rw-r--r--src/cmd/5l/obj.c13
-rw-r--r--src/cmd/ld/lib.c7
-rw-r--r--src/pkg/syscall/asm_linux_arm.s9
4 files changed, 23 insertions, 7 deletions
diff --git a/src/cmd/5l/l.h b/src/cmd/5l/l.h
index 09fbda8c2..05a20bad3 100644
--- a/src/cmd/5l/l.h
+++ b/src/cmd/5l/l.h
@@ -123,6 +123,7 @@ struct Sym
short become;
short frame;
uchar subtype;
+ uchar dupok;
uchar reachable;
int32 value;
int32 sig;
diff --git a/src/cmd/5l/obj.c b/src/cmd/5l/obj.c
index 574d50648..45751e8c5 100644
--- a/src/cmd/5l/obj.c
+++ b/src/cmd/5l/obj.c
@@ -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;
diff --git a/src/cmd/ld/lib.c b/src/cmd/ld/lib.c
index 0ca165417..208a55b44 100644
--- a/src/cmd/ld/lib.c
+++ b/src/cmd/ld/lib.c
@@ -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;
diff --git a/src/pkg/syscall/asm_linux_arm.s b/src/pkg/syscall/asm_linux_arm.s
index f7153d549..8aa5f348c 100644
--- a/src/pkg/syscall/asm_linux_arm.s
+++ b/src/pkg/syscall/asm_linux_arm.s
@@ -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