diff options
Diffstat (limited to 'src/cmd/gc/obj.c')
-rw-r--r-- | src/cmd/gc/obj.c | 292 |
1 files changed, 0 insertions, 292 deletions
diff --git a/src/cmd/gc/obj.c b/src/cmd/gc/obj.c deleted file mode 100644 index f34fc76c8..000000000 --- a/src/cmd/gc/obj.c +++ /dev/null @@ -1,292 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -#include "go.h" - -/* - * architecture-independent object file output - */ - -static void outhist(Biobuf *b); -static void dumpglobls(void); - -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\n", getgoos(), thestring, getgoversion()); - 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); - - // add nil plist w AEND to catch - // auto-generated trampolines, data - newplist(); - - dumpglobls(); - dumptypestructs(); - dumpdata(); - dumpfuncs(); - - Bterm(bout); -} - -static void -dumpglobls(void) -{ - Node *n; - NodeList *l; - - // add globals - for(l=externdcl; l; l=l->next) { - n = l->n; - if(n->op != ONAME) - continue; - - if(n->type == T) - fatal("external %#N nil type\n", n); - if(n->class == PFUNC) - continue; - if(n->sym->pkg != localpkg) - continue; - dowidth(n->type); - - ggloblnod(n, n->type->width); - } -} - -void -Bputname(Biobuf *b, Sym *s) -{ - Bprint(b, "%s", s->pkg->prefix); - Bputc(b, '.'); - Bwrite(b, s->name, strlen(s->name)+1); -} - -static void -outzfile(Biobuf *b, char *p) -{ - char *q, *q2; - - while(p) { - q = utfrune(p, '/'); - if(windows) { - q2 = utfrune(p, '\\'); - if(q2 && (!q || q2 < q)) - q = q2; - } - if(!q) { - zfile(b, p, strlen(p)); - return; - } - if(q > p) - zfile(b, p, q-p); - p = q + 1; - } -} - -#define isdelim(c) (c == '/' || c == '\\') - -static void -outwinname(Biobuf *b, Hist *h, char *ds, char *p) -{ - if(isdelim(p[0])) { - // full rooted name - zfile(b, ds, 3); // leading "c:/" - outzfile(b, p+1); - } else { - // relative name - if(h->offset == 0 && pathname && pathname[1] == ':') { - if(tolowerrune(ds[0]) == tolowerrune(pathname[0])) { - // using current drive - zfile(b, pathname, 3); // leading "c:/" - outzfile(b, pathname+3); - } else { - // using drive other then current, - // we don't have any simple way to - // determine current working directory - // there, therefore will output name as is - zfile(b, ds, 2); // leading "c:" - } - } - outzfile(b, p); - } -} - -static void -outhist(Biobuf *b) -{ - Hist *h; - char *p, ds[] = {'c', ':', '/', 0}; - - for(h = hist; h != H; h = h->link) { - p = h->name; - if(p) { - if(windows) { - // if windows variable is set, then, we know already, - // pathname is started with windows drive specifier - // and all '\' were replaced with '/' (see lex.c) - if(isdelim(p[0]) && isdelim(p[1])) { - // file name has network name in it, - // like \\server\share\dir\file.go - zfile(b, "//", 2); // leading "//" - outzfile(b, p+2); - } else if(p[1] == ':') { - // file name has drive letter in it - ds[0] = p[0]; - outwinname(b, h, ds, p+2); - } else { - // no drive letter in file name - outwinname(b, h, pathname, p); - } - } else { - if(p[0] == '/') { - // full rooted name, like /home/rsc/dir/file.go - zfile(b, "/", 1); // leading "/" - outzfile(b, p+1); - } else { - // relative name, like dir/file.go - if(h->offset == 0 && pathname && pathname[0] == '/') { - zfile(b, "/", 1); // leading "/" - outzfile(b, pathname+1); - } - outzfile(b, p); - } - } - } - zhist(b, h->line, h->offset); - } -} - -void -ieeedtod(uint64 *ieee, double native) -{ - double fr, ho, f; - int exp; - uint32 h, l; - uint64 bits; - - if(native < 0) { - ieeedtod(ieee, -native); - *ieee |= 1ULL<<63; - return; - } - if(native == 0) { - *ieee = 0; - return; - } - fr = frexp(native, &exp); - f = 2097152L; /* shouldnt use fp constants here */ - fr = modf(fr*f, &ho); - h = ho; - h &= 0xfffffL; - f = 65536L; - fr = modf(fr*f, &ho); - l = ho; - l <<= 16; - l |= (int32)(fr*f); - bits = ((uint64)h<<32) | l; - if(exp < -1021) { - // gradual underflow - bits |= 1LL<<52; - bits >>= -1021 - exp; - exp = -1022; - } - bits |= (uint64)(exp+1022L) << 52; - *ieee = bits; -} - -int -duint8(Sym *s, int off, uint8 v) -{ - return duintxx(s, off, v, 1); -} - -int -duint16(Sym *s, int off, uint16 v) -{ - return duintxx(s, off, v, 2); -} - -int -duint32(Sym *s, int off, uint32 v) -{ - return duintxx(s, off, v, 4); -} - -int -duint64(Sym *s, int off, uint64 v) -{ - return duintxx(s, off, v, 8); -} - -int -duintptr(Sym *s, int off, uint64 v) -{ - return duintxx(s, off, v, widthptr); -} - -Sym* -stringsym(char *s, int len) -{ - static int gen; - Sym *sym; - int off, n, m; - struct { - Strlit lit; - char buf[110]; - } tmp; - Pkg *pkg; - - if(len > 100) { - // huge strings are made static to avoid long names - snprint(namebuf, sizeof(namebuf), ".gostring.%d", ++gen); - pkg = localpkg; - } else { - // small strings get named by their contents, - // so that multiple modules using the same string - // can share it. - tmp.lit.len = len; - memmove(tmp.lit.s, s, len); - tmp.lit.s[len] = '\0'; - snprint(namebuf, sizeof(namebuf), "\"%Z\"", &tmp); - pkg = gostringpkg; - } - sym = pkglookup(namebuf, pkg); - - // SymUniq flag indicates that data is generated already - if(sym->flags & SymUniq) - return sym; - sym->flags |= SymUniq; - - data(); - off = 0; - - // string header - off = dsymptr(sym, off, sym, widthptr+4); - off = duint32(sym, off, len); - - // string data - for(n=0; n<len; n+=m) { - m = 8; - if(m > len-n) - m = len-n; - off = dsname(sym, off, s+n, m); - } - off = duint8(sym, off, 0); // terminating NUL for runtime - off = (off+widthptr-1)&~(widthptr-1); // round to pointer alignment - ggloblsym(sym, off, 1); - text(); - - return sym; -} |