From 651972b31f7da9a1d522fc427a6d6693070f1cb5 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 10 Feb 2009 11:46:26 -0800 Subject: [PATCH] Implement unsafe.Alignof. R=ken DELTA=20 (19 added, 0 deleted, 1 changed) OCL=24719 CL=24771 --- src/cmd/gc/dcl.c | 19 ++++++++++++++++++- src/cmd/gc/sysimport.c | 1 + src/cmd/gc/unsafe.go | 1 + 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c index d5d3a9bf4df..35d1a8e62b6 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 4d682d675d0..ccc38343d7e 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 47703f6e0ff..d1dcee02a83 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;