func dumpasmhdr() { b, err := bio.Create(asmhdr) if err != nil { Fatalf("%v", err) } fmt.Fprintf(b, "// generated by compile -asmhdr from package %s\n\n", localpkg.Name) for _, n := range asmlist { if isblanksym(n.Sym) { continue } switch n.Op { case OLITERAL: fmt.Fprintf(b, "#define const_%s %#v\n", n.Sym.Name, n.Val()) case OTYPE: t := n.Type if !t.IsStruct() || t.StructType().Map != nil || t.IsFuncArgStruct() { break } fmt.Fprintf(b, "#define %s__size %d\n", t.Sym.Name, int(t.Width)) for _, t := range t.Fields().Slice() { if !isblanksym(t.Sym) { fmt.Fprintf(b, "#define %s_%s %d\n", n.Sym.Name, t.Sym.Name, int(t.Offset)) } } } } b.Close() }
func dumpobj1(outfile string, mode int) { var err error bout, err = bio.Create(outfile) if err != nil { flusherrors() fmt.Printf("can't create %s: %v\n", outfile, err) errorexit() } startobj := int64(0) var arhdr [ArhdrSize]byte if writearchive { bout.WriteString("!<arch>\n") arhdr = [ArhdrSize]byte{} bout.Write(arhdr[:]) startobj = bout.Offset() } printheader := func() { fmt.Fprintf(bout, "go object %s %s %s %s\n", obj.GOOS, obj.GOARCH, obj.Version, obj.Expstring()) if buildid != "" { fmt.Fprintf(bout, "build id %q\n", buildid) } if localpkg.Name == "main" { fmt.Fprintf(bout, "main\n") } if safemode { fmt.Fprintf(bout, "safe\n") } else { fmt.Fprintf(bout, "----\n") // room for some other tool to write "safe" } fmt.Fprintf(bout, "\n") // header ends with blank line } printheader() if mode&modeCompilerObj != 0 { dumpexport() } if writearchive { bout.Flush() size := bout.Offset() - startobj if size&1 != 0 { bout.WriteByte(0) } bout.Seek(startobj-ArhdrSize, 0) formathdr(arhdr[:], "__.PKGDEF", size) bout.Write(arhdr[:]) bout.Flush() bout.Seek(startobj+size+(size&1), 0) } if mode&modeLinkerObj == 0 { bout.Close() return } if writearchive { // start object file arhdr = [ArhdrSize]byte{} bout.Write(arhdr[:]) startobj = bout.Offset() printheader() } if pragcgobuf != "" { if writearchive { // write empty export section; must be before cgo section fmt.Fprintf(bout, "\n$$\n\n$$\n\n") } fmt.Fprintf(bout, "\n$$ // cgo\n") fmt.Fprintf(bout, "%s\n$$\n\n", pragcgobuf) } fmt.Fprintf(bout, "\n!\n") externs := len(externdcl) dumpglobls() dumpptabs() dumptypestructs() // Dump extra globals. tmp := externdcl if externdcl != nil { externdcl = externdcl[externs:] } dumpglobls() externdcl = tmp if zerosize > 0 { zero := Pkglookup("zero", mappkg) ggloblsym(zero, int32(zerosize), obj.DUPOK|obj.RODATA) } obj.Writeobjdirect(Ctxt, bout.Writer) if writearchive { bout.Flush() size := bout.Offset() - startobj if size&1 != 0 { bout.WriteByte(0) } bout.Seek(startobj-ArhdrSize, 0) formathdr(arhdr[:], "_go_.o", size) bout.Write(arhdr[:]) } bout.Close() }