summaryrefslogtreecommitdiff
path: root/src/cmd/5g/gobj.c
diff options
context:
space:
mode:
authorKai Backman <kaib@golang.org>2009-07-13 22:06:28 -0700
committerKai Backman <kaib@golang.org>2009-07-13 22:06:28 -0700
commit7f2eba29c1c887cc0a1148bd41580d92cc817195 (patch)
treed0f8230db83e60bd8e364523fb2318e0afb7ec11 /src/cmd/5g/gobj.c
parented457814e5f874a16649e4725906e8ae75d7722f (diff)
downloadgolang-7f2eba29c1c887cc0a1148bd41580d92cc817195.tar.gz
added missing pieces required by reflection
R=rsc APPROVED=rsc DELTA=61 (40 added, 18 deleted, 3 changed) OCL=31502 CL=31580
Diffstat (limited to 'src/cmd/5g/gobj.c')
-rw-r--r--src/cmd/5g/gobj.c58
1 files changed, 40 insertions, 18 deletions
diff --git a/src/cmd/5g/gobj.c b/src/cmd/5g/gobj.c
index b8f8f68e9..47de270d0 100644
--- a/src/cmd/5g/gobj.c
+++ b/src/cmd/5g/gobj.c
@@ -484,46 +484,67 @@ dstringptr(Sym *s, int off, char *str)
}
int
-duintxx(Sym *s, int off, uint64 v, int wid)
+dgostrlitptr(Sym *s, int off, Strlit *lit)
{
Prog *p;
- off = rnd(off, wid);
+ if(lit == nil)
+ return duintptr(s, off, 0);
+ off = rnd(off, widthptr);
p = gins(ADATA, N, N);
p->from.type = D_OREG;
p->from.name = D_EXTERN;
p->from.sym = s;
p->from.offset = off;
- p->reg = wid;
+ p->from.reg = widthptr;
+ datagostring(lit, &p->to);
p->to.type = D_CONST;
- p->to.name = D_NONE;
- p->to.offset = v;
- off += wid;
+ p->to.etype = TINT32;
+ off += widthptr;
return off;
}
int
-duint32(Sym *s, int off, uint32 v)
+dgostringptr(Sym *s, int off, char *str)
{
- return duintxx(s, off, v, 4);
-}
+ int n;
+ Strlit *lit;
-int
-duint16(Sym *s, int off, uint32 v)
-{
- return duintxx(s, off, v, 2);
+ if(str == nil)
+ return duintptr(s, off, 0);
+
+ n = strlen(str);
+ lit = mal(sizeof *lit + n);
+ strcpy(lit->s, str);
+ lit->len = n;
+ return dgostrlitptr(s, off, lit);
}
int
-duintptr(Sym *s, int off, uint32 v)
+duintxx(Sym *s, int off, uint64 v, int wid)
{
- return duintxx(s, off, v, 8);
+ Prog *p;
+
+ off = rnd(off, wid);
+
+ p = gins(ADATA, N, N);
+ p->from.type = D_OREG;
+ p->from.name = D_EXTERN;
+ p->from.sym = s;
+ p->from.offset = off;
+ p->reg = wid;
+ p->to.type = D_CONST;
+ p->to.name = D_NONE;
+ p->to.offset = v;
+ off += wid;
+
+ return off;
}
int
-dsymptr(Sym *s, int off, Sym *x)
+dsymptr(Sym *s, int off, Sym *x, int xoff)
{
Prog *p;
@@ -538,7 +559,7 @@ dsymptr(Sym *s, int off, Sym *x)
p->to.type = D_CONST;
p->to.name = D_EXTERN;
p->to.sym = x;
- p->to.offset = 0;
+ p->to.offset = xoff;
off += widthptr;
return off;
@@ -546,9 +567,10 @@ dsymptr(Sym *s, int off, Sym *x)
void
-genembedtramp(Type *t, Sig *b)
+genembedtramp(Type *rcvr, Type *method, Sym *newnam)
{
fatal("genembedtramp not implemented");
+ // TODO(kaib): re-lift from 8g
// Sym *e;
// int c, d, o, loaded;
// Prog *p;