Skip to content

Instantly share code, notes, and snippets.

@minux
Created December 16, 2014 22:44
Show Gist options
  • Save minux/69994348b4f06b1c324b to your computer and use it in GitHub Desktop.
Save minux/69994348b4f06b1c324b to your computer and use it in GitHub Desktop.
Issue 9355
diff --git a/src/cmd/6g/gsubr.c b/src/cmd/6g/gsubr.c
index 5bd9246..dae57af 100644
--- a/src/cmd/6g/gsubr.c
+++ b/src/cmd/6g/gsubr.c
@@ -1115,6 +1115,8 @@ void
naddr(Node *n, Addr *a, int canemitcode)
{
Sym *s;
+ Node *nn;
+ int64 oary[10];
a->scale = 0;
a->index = D_NONE;
@@ -1279,6 +1281,14 @@ naddr(Node *n, Addr *a, int canemitcode)
break;
}
fatal("naddr: OADDR\n");
+
+ case ODOT:
+ if(dotoffset(n, oary, &nn) != 1)
+ fatal("naddr: ODOT\n");
+ a->type = D_EXTERN;
+ a->sym = linksym(n->left->sym);
+ a->offset = oary[0];
+ break;
case OITAB:
// itable of interface value
diff --git a/src/cmd/gc/sinit.c b/src/cmd/gc/sinit.c
index 8ad7ae7..de923e0 100644
--- a/src/cmd/gc/sinit.c
+++ b/src/cmd/gc/sinit.c
@@ -374,12 +374,13 @@ staticcopy(Node *l, Node *r, NodeList **out)
static int
staticassign(Node *l, Node *r, NodeList **out)
{
- Node *a, n1;
+ Node *a, n1, *nn;
Type *ta;
InitPlan *p;
InitEntry *e;
int i;
Strlit *sval;
+ int64 oary[10];
switch(r->op) {
default:
@@ -406,6 +407,14 @@ staticassign(Node *l, Node *r, NodeList **out)
case ONAME:
gdata(l, r, l->type->width);
return 1;
+
+ case ODOT:
+ // only handle the case where offset can be determined
+ // statically without following pointers
+ if(dotoffset(r->left, oary, &nn) != 1)
+ break;
+ gdata(l, r, l->type->width);
+ return 1;
}
case OPTRLIT:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment