Commit 41da64ed by Ian Lance Taylor

runtime: Fix chan code for big-endian strict-alignment systems

From-SVN: r184115
parent c3b0c721
...@@ -409,11 +409,20 @@ closed: ...@@ -409,11 +409,20 @@ closed:
void void
__go_send_small(ChanType *t, Hchan* c, uint64 val) __go_send_small(ChanType *t, Hchan* c, uint64 val)
{ {
byte b[sizeof(uint64)]; union
{
runtime_memclr(b, sizeof(uint64)); byte b[sizeof(uint64)];
__builtin_memcpy(b, &val, t->__element_type->__size); uint64 v;
runtime_chansend(t, c, b, nil); } u;
byte *p;
u.v = val;
#ifndef WORDS_BIGENDIAN
p = u.b;
#else
p = u.b + sizeof(uint64) - t->__element_type->__size;
#endif
runtime_chansend(t, c, p, nil);
} }
// The compiler generates a call to __go_send_big to send a value // The compiler generates a call to __go_send_big to send a value
...@@ -433,9 +442,15 @@ __go_receive_small(ChanType *t, Hchan* c) ...@@ -433,9 +442,15 @@ __go_receive_small(ChanType *t, Hchan* c)
byte b[sizeof(uint64)]; byte b[sizeof(uint64)];
uint64 v; uint64 v;
} u; } u;
byte *p;
u.v = 0; u.v = 0;
runtime_chanrecv(t, c, u.b, nil, nil); #ifndef WORDS_BIGENDIAN
p = u.b;
#else
p = u.b + sizeof(uint64) - t->__element_type->__size;
#endif
runtime_chanrecv(t, c, p, nil, nil);
return u.v; return u.v;
} }
...@@ -654,8 +669,8 @@ newselect(int32 size, Select **selp) ...@@ -654,8 +669,8 @@ newselect(int32 size, Select **selp)
sel->tcase = size; sel->tcase = size;
sel->ncase = 0; sel->ncase = 0;
sel->pollorder = (void*)(sel->scase + size); sel->lockorder = (void*)(sel->scase + size);
sel->lockorder = (void*)(sel->pollorder + size); sel->pollorder = (void*)(sel->lockorder + size);
*selp = sel; *selp = sel;
if(debug) if(debug)
......
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