Commit f76f1203 authored by Russ Cox's avatar Russ Cox

cmd/ld: use 64-bit alignment for large data and bss objects

Check for specific, important misalignment in garbage collector.
Not a complete fix for issue 599 but an important workaround.

Update #599.

R=golang-dev, iant, dvyukov
CC=golang-dev
https://golang.org/cl/6641049
parent 3aae5a0e
...@@ -831,7 +831,9 @@ dosymtype(void) ...@@ -831,7 +831,9 @@ dosymtype(void)
static int32 static int32
alignsymsize(int32 s) alignsymsize(int32 s)
{ {
if(s >= PtrSize) if(s >= 8)
s = rnd(s, 8);
else if(s >= PtrSize)
s = rnd(s, PtrSize); s = rnd(s, PtrSize);
else if(s > 2) else if(s > 2)
s = rnd(s, 4); s = rnd(s, 4);
...@@ -1054,6 +1056,7 @@ dodata(void) ...@@ -1054,6 +1056,7 @@ dodata(void)
datsize += rnd(s->size, PtrSize); datsize += rnd(s->size, PtrSize);
} }
sect->len = datsize - sect->vaddr; sect->len = datsize - sect->vaddr;
datsize = rnd(datsize, PtrSize);
/* gcdata */ /* gcdata */
sect = addsection(&segtext, ".gcdata", 04); sect = addsection(&segtext, ".gcdata", 04);
......
...@@ -892,6 +892,12 @@ runtime·gc(int32 force) ...@@ -892,6 +892,12 @@ runtime·gc(int32 force)
M *m1; M *m1;
uint32 i; uint32 i;
// The atomic operations are not atomic if the uint64s
// are not aligned on uint64 boundaries. This has been
// a problem in the past.
if((((uintptr)&work.empty) & 7) != 0)
runtime·throw("runtime: gc work buffer is misaligned");
// The gc is turned off (via enablegc) until // The gc is turned off (via enablegc) until
// the bootstrap has completed. // the bootstrap has completed.
// Also, malloc gets called in the guts // Also, malloc gets called in the guts
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment