void dumpobj(void) { bout = Bopen(outfile, OWRITE); if(bout == nil) { flusherrors(); print("can't create %s: %r\n", outfile); errorexit(); } Bprint(bout, "go object %s %s %s %s\n", getgoos(), thestring, getgoversion(), expstring()); Bprint(bout, " exports automatically generated from\n"); Bprint(bout, " %s in package \"%s\"\n", curio.infile, localpkg->name); dumpexport(); Bprint(bout, "\n!\n"); outhist(bout); dumpglobls(); dumptypestructs(); dumpdata(); dumpfuncs(); Bterm(bout); }
void dumpobj(void) { NodeList *externs, *tmp; bout = Bopen(outfile, OWRITE); if(bout == nil) { flusherrors(); print("can't create %s: %r\n", outfile); errorexit(); } Bprint(bout, "go object %s %s %s %s\n", getgoos(), thestring, getgoversion(), expstring()); Bprint(bout, " exports automatically generated from\n"); Bprint(bout, " %s in package \"%s\"\n", curio.infile, localpkg->name); dumpexport(); Bprint(bout, "\n!\n"); outhist(bout); externs = nil; if(externdcl != nil) externs = externdcl->end; dumpglobls(); dumptypestructs(); // Dump extra globals. tmp = externdcl; if(externs != nil) externdcl = externs->next; dumpglobls(); externdcl = tmp; dumpdata(); dumpfuncs(); Bterm(bout); }
void dumpobj(void) { NodeList *externs, *tmp; char arhdr[ArhdrSize]; vlong startobj, size; Sym *zero; bout = Bopen(outfile, OWRITE); if(bout == nil) { flusherrors(); print("can't create %s: %r\n", outfile); errorexit(); } startobj = 0; if(writearchive) { Bwrite(bout, "!<arch>\n", 8); memset(arhdr, 0, sizeof arhdr); Bwrite(bout, arhdr, sizeof arhdr); startobj = Boffset(bout); } Bprint(bout, "go object %s %s %s %s\n", getgoos(), getgoarch(), getgoversion(), expstring()); dumpexport(); if(writearchive) { Bflush(bout); size = Boffset(bout) - startobj; if(size&1) Bputc(bout, 0); Bseek(bout, startobj - ArhdrSize, 0); formathdr(arhdr, "__.PKGDEF", size); Bwrite(bout, arhdr, ArhdrSize); Bflush(bout); Bseek(bout, startobj + size + (size&1), 0); memset(arhdr, 0, ArhdrSize); Bwrite(bout, arhdr, ArhdrSize); startobj = Boffset(bout); Bprint(bout, "go object %s %s %s %s\n", getgoos(), getgoarch(), getgoversion(), expstring()); } Bprint(bout, "\n!\n"); externs = nil; if(externdcl != nil) externs = externdcl->end; dumpglobls(); dumptypestructs(); // Dump extra globals. tmp = externdcl; if(externs != nil) externdcl = externs->next; dumpglobls(); externdcl = tmp; zero = pkglookup("zerovalue", runtimepkg); ggloblsym(zero, zerosize, 1, 1); dumpdata(); writeobj(ctxt, bout); if(writearchive) { Bflush(bout); size = Boffset(bout) - startobj; if(size&1) Bputc(bout, 0); Bseek(bout, startobj - ArhdrSize, 0); snprint(namebuf, sizeof namebuf, "_go_.%c", thechar); formathdr(arhdr, namebuf, size); Bwrite(bout, arhdr, ArhdrSize); } Bterm(bout); }
static void init1(Node *n, NodeList **out) { NodeList *l; if(n == N) return; init1(n->left, out); init1(n->right, out); for(l=n->list; l; l=l->next) init1(l->n, out); if(n->op != ONAME) return; switch(n->class) { case PEXTERN: case PFUNC: break; default: if(isblank(n) && n->defn != N && !n->defn->initorder) { n->defn->initorder = 1; *out = list(*out, n->defn); } return; } if(n->initorder == 1) return; if(n->initorder == 2) { if(n->class == PFUNC) return; // if there have already been errors printed, // those errors probably confused us and // there might not be a loop. let the user // fix those first. flusherrors(); if(nerrors > 0) errorexit(); print("initialization loop:\n"); for(l=initlist;; l=l->next) { if(l->next == nil) break; l->next->end = l; } for(; l; l=l->end) print("\t%L %S refers to\n", l->n->lineno, l->n->sym); print("\t%L %S\n", n->lineno, n->sym); errorexit(); } n->initorder = 2; l = malloc(sizeof *l); l->next = initlist; l->n = n; l->end = nil; initlist = l; // make sure that everything n depends on is initialized. // n->defn is an assignment to n if(n->defn != N) { switch(n->defn->op) { default: goto bad; case ODCLFUNC: init2list(n->defn->nbody, out); break; case OAS: if(n->defn->left != n) goto bad; n->defn->dodata = 1; init1(n->defn->right, out); if(debug['j']) print("%S\n", n->sym); *out = list(*out, n->defn); break; case OAS2FUNC: case OAS2MAPR: case OAS2DOTTYPE: case OAS2RECV: if(n->defn->initorder) break; n->defn->initorder = 1; for(l=n->defn->rlist; l; l=l->next) init1(l->n, out); *out = list(*out, n->defn); break; } } l = initlist; initlist = l->next; if(l->n != n) fatal("bad initlist"); free(l); n->initorder = 1; return; bad: dump("defn", n->defn); fatal("init1: bad defn"); }