| // 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. | |
| package gc | |
| import ( | |
| "fmt" | |
| "go/constant" | |
| "cmd/compile/internal/base" | |
| "cmd/compile/internal/ir" | |
| "cmd/compile/internal/typecheck" | |
| "cmd/compile/internal/types" | |
| "cmd/internal/bio" | |
| ) | |
| func dumpasmhdr() { | |
| b, err := bio.Create(base.Flag.AsmHdr) | |
| if err != nil { | |
| base.Fatalf("%v", err) | |
| } | |
| fmt.Fprintf(b, "// generated by compile -asmhdr from package %s\n\n", types.LocalPkg.Name) | |
| for _, n := range typecheck.Target.Asms { | |
| if n.Sym().IsBlank() { | |
| continue | |
| } | |
| switch n.Op() { | |
| case ir.OLITERAL: | |
| t := n.Val().Kind() | |
| if t == constant.Float || t == constant.Complex { | |
| break | |
| } | |
| fmt.Fprintf(b, "#define const_%s %#v\n", n.Sym().Name, n.Val()) | |
| case ir.OTYPE: | |
| t := n.Type() | |
| if !t.IsStruct() || t.StructType().Map != nil || t.IsFuncArgStruct() { | |
| break | |
| } | |
| fmt.Fprintf(b, "#define %s__size %d\n", n.Sym().Name, int(t.Size())) | |
| for _, f := range t.Fields().Slice() { | |
| if !f.Sym.IsBlank() { | |
| fmt.Fprintf(b, "#define %s_%s %d\n", n.Sym().Name, f.Sym.Name, int(f.Offset)) | |
| } | |
| } | |
| } | |
| } | |
| b.Close() | |
| } |