Commit 651972b3 authored by Ian Lance Taylor's avatar Ian Lance Taylor

Implement unsafe.Alignof.

R=ken
DELTA=20  (19 added, 0 deleted, 1 changed)
OCL=24719
CL=24771
parent d94c5aba
...@@ -1495,6 +1495,7 @@ unsafenmagic(Node *l, Node *r) ...@@ -1495,6 +1495,7 @@ unsafenmagic(Node *l, Node *r)
{ {
Node *n; Node *n;
Sym *s; Sym *s;
Type *t;
long v; long v;
Val val; Val val;
...@@ -1519,7 +1520,23 @@ unsafenmagic(Node *l, Node *r) ...@@ -1519,7 +1520,23 @@ unsafenmagic(Node *l, Node *r)
if(r->op != ODOT && r->op != ODOTPTR) if(r->op != ODOT && r->op != ODOTPTR)
goto no; goto no;
walktype(r, Erv); walktype(r, Erv);
v = n->xoffset; v = r->xoffset;
goto yes;
}
if(strcmp(s->name, "Alignof") == 0) {
walktype(r, Erv);
if (r->type == T)
goto no;
// make struct { byte; T; }
t = typ(TSTRUCT);
t->type = typ(TFIELD);
t->type->type = types[TUINT8];
t->type->down = typ(TFIELD);
t->type->down->type = r->type;
// compute struct widths
dowidth(t);
// the offset of T is its required alignment
v = t->type->down->width;
goto yes; goto yes;
} }
......
...@@ -67,5 +67,6 @@ char *unsafeimport = ...@@ -67,5 +67,6 @@ char *unsafeimport =
"type unsafe.Pointer *any\n" "type unsafe.Pointer *any\n"
"func unsafe.Offsetof (? any) (? int)\n" "func unsafe.Offsetof (? any) (? int)\n"
"func unsafe.Sizeof (? any) (? int)\n" "func unsafe.Sizeof (? any) (? int)\n"
"func unsafe.Alignof (? any) (? int)\n"
"\n" "\n"
"$$\n"; "$$\n";
...@@ -8,3 +8,4 @@ package PACKAGE ...@@ -8,3 +8,4 @@ package PACKAGE
type Pointer *any; type Pointer *any;
func Offsetof(any) int; func Offsetof(any) int;
func Sizeof(any) int; func Sizeof(any) int;
func Alignof(any) int;
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