}
// log.Printf("GLOBL %s %d, $%d", name, flag, size)
- prog := &obj.Prog{
- Ctxt: p.ctxt,
- As: obj.AGLOBL,
- Lineno: p.histLineNum,
- From: nameAddr,
- From3: &obj.Addr{
- Offset: flag,
- },
- To: addr,
- }
- p.append(prog, "", false)
+ p.ctxt.Globl(nameAddr.Sym, addr.Offset, int(flag))
}
// asmPCData assembles a PCDATA pseudo-op.
// If we have compile errors, ignore any assembler/linker errors.
Ctxt.DiagFunc = func(string, ...interface{}) {}
}
- flushdata()
obj.Flushplist(Ctxt) // convert from Prog list to machine code
}
"fmt"
)
-var (
- ddumped bool
- dfirst *obj.Prog
- dpc *obj.Prog
-)
-
func Prog(as obj.As) *obj.Prog {
var p *obj.Prog
- if as == obj.AGLOBL {
- if ddumped {
- Fatalf("already dumped data")
- }
- if dpc == nil {
- dpc = Ctxt.NewProg()
- dfirst = dpc
- }
-
- p = dpc
- dpc = Ctxt.NewProg()
- p.Link = dpc
- } else {
- p = Pc
- Pc = Ctxt.NewProg()
- Clearp(Pc)
- p.Link = Pc
- }
+ p = Pc
+ Pc = Ctxt.NewProg()
+ Clearp(Pc)
+ p.Link = Pc
if lineno == 0 && Debug['K'] != 0 {
Warn("prog: line 0")
return q
}
-func dumpdata() {
- ddumped = true
- if dfirst == nil {
- return
- }
- newplist()
- *Pc = *dfirst
- Pc = dpc
- Clearp(Pc)
-}
-
-func flushdata() {
- if dfirst == nil {
- return
- }
- newplist()
- *Pc = *dfirst
- Pc = dpc
- Clearp(Pc)
- dfirst = nil
- dpc = nil
-}
-
// Fixup instructions after allocauto (formerly compactframe) has moved all autos around.
func fixautoused(p *obj.Prog) {
for lp := &p; ; {
}
func ggloblnod(nam *Node) {
- p := Gins(obj.AGLOBL, nam, nil)
- p.Lineno = nam.Lineno
- p.From.Sym.Gotype = Linksym(ngotype(nam))
- p.To.Sym = nil
- p.To.Type = obj.TYPE_CONST
- p.To.Offset = nam.Type.Width
- p.From3 = new(obj.Addr)
+ s := Linksym(nam.Sym)
+ s.Gotype = Linksym(ngotype(nam))
+ flags := 0
if nam.Name.Readonly {
- p.From3.Offset = obj.RODATA
+ flags = obj.RODATA
}
if nam.Type != nil && !haspointers(nam.Type) {
- p.From3.Offset |= obj.NOPTR
+ flags |= obj.NOPTR
}
+ Ctxt.Globl(s, nam.Type.Width, flags)
}
func ggloblsym(s *Sym, width int32, flags int16) {
}
func ggloblLSym(s *obj.LSym, width int32, flags int16) {
- p := Gins(obj.AGLOBL, nil, nil)
- p.From.Type = obj.TYPE_MEM
- p.From.Name = obj.NAME_EXTERN
- p.From.Sym = s
if flags&obj.LOCAL != 0 {
- p.From.Sym.Local = true
+ s.Local = true
flags &^= obj.LOCAL
}
- p.To.Type = obj.TYPE_CONST
- p.To.Offset = int64(width)
- p.From3 = new(obj.Addr)
- p.From3.Offset = int64(flags)
+ Ctxt.Globl(s, int64(width), int(flags))
}
func gtrack(s *Sym) {
func Gins(as obj.As, f, t *Node) *obj.Prog {
switch as {
case obj.AVARKILL, obj.AVARLIVE, obj.AVARDEF, obj.ATYPE,
- obj.ATEXT, obj.AFUNCDATA, obj.AUSEFIELD, obj.AGLOBL:
+ obj.ATEXT, obj.AFUNCDATA, obj.AUSEFIELD:
default:
Fatalf("unhandled gins op %v", as)
}
ggloblsym(zero, int32(zerosize), obj.DUPOK|obj.RODATA)
}
- dumpdata()
obj.Writeobjdirect(Ctxt, bout.Writer)
if writearchive {
if false {
fmt.Printf("analyzing '%v'\n", p)
}
- if p.As != obj.AGLOBL && p.As != obj.ATYPE {
+ if p.As != obj.ATYPE {
checkprog(fn, p)
}
}
ADUFFZERO
AEND
AFUNCDATA
- AGLOBL
AJMP
ANOP
APCDATA
curtext.Autom = a
continue
- case AGLOBL:
- s := p.From.Sym
- if s.Seenglobl {
- fmt.Printf("duplicate %v\n", p)
- }
- s.Seenglobl = true
- if s.Onlist {
- log.Fatalf("symbol %s listed multiple times", s.Name)
- }
- s.Onlist = true
- ctxt.Data = append(ctxt.Data, s)
- s.Size = p.To.Offset
- if s.Type == 0 || s.Type == SXREF {
- s.Type = SBSS
- }
- flag := int(p.From3.Offset)
- if flag&DUPOK != 0 {
- s.Dupok = true
- }
- if flag&RODATA != 0 {
- s.Type = SRODATA
- } else if flag&NOPTR != 0 {
- s.Type = SNOPTRBSS
- } else if flag&TLSBSS != 0 {
- s.Type = STLSBSS
- }
- continue
-
case ATEXT:
s := p.From.Sym
if s == nil {
ctxt.freeProgs()
}
}
+
+func (ctxt *Link) Globl(s *LSym, size int64, flag int) {
+ if s.Seenglobl {
+ fmt.Printf("duplicate %v\n", s)
+ }
+ s.Seenglobl = true
+ if s.Onlist {
+ log.Fatalf("symbol %s listed multiple times", s.Name)
+ }
+ s.Onlist = true
+ ctxt.Data = append(ctxt.Data, s)
+ s.Size = size
+ if s.Type == 0 || s.Type == SXREF {
+ s.Type = SBSS
+ }
+ if flag&DUPOK != 0 {
+ s.Dupok = true
+ }
+ if flag&RODATA != 0 {
+ s.Type = SRODATA
+ } else if flag&NOPTR != 0 {
+ s.Type = SNOPTRBSS
+ } else if flag&TLSBSS != 0 {
+ s.Type = STLSBSS
+ }
+}
sep = ", "
}
if p.From3Type() != TYPE_NONE {
- if p.From3.Type == TYPE_CONST && (p.As == ATEXT || p.As == AGLOBL) {
+ if p.From3.Type == TYPE_CONST && p.As == ATEXT {
// Special case - omit $.
fmt.Fprintf(&buf, "%s%d", sep, p.From3.Offset)
} else if quadOpAmd64 {
"DUFFZERO",
"END",
"FUNCDATA",
- "GLOBL",
"JMP",
"NOP",
"PCDATA",
{AFXSAVE, ysvrs, Pm, [23]uint8{0xae, 00, 0xae, 00}},
{AFXRSTOR64, ysvrs, Pw, [23]uint8{0x0f, 0xae, 01, 0x0f, 0xae, 01}},
{AFXSAVE64, ysvrs, Pw, [23]uint8{0x0f, 0xae, 00, 0x0f, 0xae, 00}},
- {obj.AGLOBL, nil, 0, [23]uint8{}},
{AHLT, ynone, Px, [23]uint8{0xf4}},
{AIDIVB, ydivb, Pb, [23]uint8{0xf6, 07}},
{AIDIVL, ydivl, Px, [23]uint8{0xf7, 07}},