summaryrefslogtreecommitdiff
path: root/src/cmd/6g/gobj.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/6g/gobj.c')
-rw-r--r--src/cmd/6g/gobj.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/cmd/6g/gobj.c b/src/cmd/6g/gobj.c
index 02dffbe4c..1d7c07eba 100644
--- a/src/cmd/6g/gobj.c
+++ b/src/cmd/6g/gobj.c
@@ -489,6 +489,46 @@ dstringptr(Sym *s, int off, char *str)
}
int
+dgostrlitptr(Sym *s, int off, Strlit *lit)
+{
+ Prog *p;
+
+ if(lit == nil)
+ return duintptr(s, off, 0);
+
+ off = rnd(off, widthptr);
+ p = gins(ADATA, N, N);
+ p->from.type = D_EXTERN;
+ p->from.index = D_NONE;
+ p->from.sym = s;
+ p->from.offset = off;
+ p->from.scale = widthptr;
+ datagostring(lit, &p->to);
+ p->to.index = p->to.type;
+ p->to.type = D_ADDR;
+ p->to.etype = TINT32;
+ off += widthptr;
+
+ return off;
+}
+
+int
+dgostringptr(Sym *s, int off, char *str)
+{
+ int n;
+ Strlit *lit;
+
+ 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
duintxx(Sym *s, int off, uint64 v, int wid)
{
Prog *p;