diff options
| author | Ian Lance Taylor <iant@golang.org> | 2009-02-10 11:46:26 -0800 |
|---|---|---|
| committer | Ian Lance Taylor <iant@golang.org> | 2009-02-10 11:46:26 -0800 |
| commit | e114da7db7c1cb0a09c2193f99ee627084f06a95 (patch) | |
| tree | d67091af3bcae0f07a74be6a8a45f697a6b12742 | |
| parent | 6246d58105c44f9ed4f5a0ae7230b8a96f55cc99 (diff) | |
| download | golang-e114da7db7c1cb0a09c2193f99ee627084f06a95.tar.gz | |
Implement unsafe.Alignof.
R=ken
DELTA=20 (19 added, 0 deleted, 1 changed)
OCL=24719
CL=24771
| -rw-r--r-- | src/cmd/gc/dcl.c | 19 | ||||
| -rw-r--r-- | src/cmd/gc/sysimport.c | 1 | ||||
| -rw-r--r-- | src/cmd/gc/unsafe.go | 1 |
3 files changed, 20 insertions, 1 deletions
diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c index d5d3a9bf4..35d1a8e62 100644 --- a/src/cmd/gc/dcl.c +++ b/src/cmd/gc/dcl.c @@ -1495,6 +1495,7 @@ unsafenmagic(Node *l, Node *r) { Node *n; Sym *s; + Type *t; long v; Val val; @@ -1519,7 +1520,23 @@ unsafenmagic(Node *l, Node *r) if(r->op != ODOT && r->op != ODOTPTR) goto no; 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; } diff --git a/src/cmd/gc/sysimport.c b/src/cmd/gc/sysimport.c index 4d682d675..ccc38343d 100644 --- a/src/cmd/gc/sysimport.c +++ b/src/cmd/gc/sysimport.c @@ -67,5 +67,6 @@ char *unsafeimport = "type unsafe.Pointer *any\n" "func unsafe.Offsetof (? any) (? int)\n" "func unsafe.Sizeof (? any) (? int)\n" + "func unsafe.Alignof (? any) (? int)\n" "\n" "$$\n"; diff --git a/src/cmd/gc/unsafe.go b/src/cmd/gc/unsafe.go index 47703f6e0..d1dcee02a 100644 --- a/src/cmd/gc/unsafe.go +++ b/src/cmd/gc/unsafe.go @@ -8,3 +8,4 @@ package PACKAGE type Pointer *any; func Offsetof(any) int; func Sizeof(any) int; +func Alignof(any) int; |
