diff options
Diffstat (limited to 'src/cmd/5c/swt.c')
-rw-r--r-- | src/cmd/5c/swt.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/cmd/5c/swt.c b/src/cmd/5c/swt.c index fd81a4e68..f39963b8f 100644 --- a/src/cmd/5c/swt.c +++ b/src/cmd/5c/swt.c @@ -60,7 +60,7 @@ swit2(C1 *q, int nc, int32 def, Node *n) if(nc >= 3) { i = (q+nc-1)->val - (q+0)->val; - if(i > 0 && i < nc*2) + if(!nacl && i > 0 && i < nc*2) goto direct; } if(nc < 5) { @@ -374,10 +374,11 @@ align(int32 i, Type *t, int op, int32 *maxalign) { int32 o; Type *v; - int w; + int w, packw; o = i; w = 1; + packw = 0; switch(op) { default: diag(Z, "unknown align opcode %d", op); @@ -388,7 +389,7 @@ align(int32 i, Type *t, int op, int32 *maxalign) if(w < 1) w = 1; if(packflg) - w = packflg; + packw = packflg; break; case Ael1: /* initial align of struct element */ @@ -404,7 +405,7 @@ align(int32 i, Type *t, int op, int32 *maxalign) if(w < 1 || w > SZ_LONG) fatal(Z, "align"); if(packflg) - w = packflg; + packw = packflg; break; case Ael2: /* width of a struct element */ @@ -440,6 +441,8 @@ align(int32 i, Type *t, int op, int32 *maxalign) w = SZ_LONG; /* because of a pun in cc/dcl.c:contig() */ break; } + if(packw != 0 && xround(o, w) != xround(o, packw)) + diag(Z, "#pragma pack changes offset of %T", t); o = xround(o, w); if(maxalign != nil && *maxalign < w) *maxalign = w; |