return 0
}
+// staticVersion reports whether the data's Symbol has <>, as in data<>.
+// It returns 1 for static, 0 for non-static, because that's what obj wants.
+func staticVersion(a *addr.Addr) int {
+ if a.Symbol != "" && a.IsStatic {
+ return 1
+ }
+ return 0
+}
+
// TODO: configure the architecture
// TODO: This is hacky and irregular. When obj settles down, rewrite for simplicity.
// a<>(SB) = STATIC,NONE
// The call to symbolType does the first column; we need to fix up Index here.
out.Type = int16(p.symbolType(a))
- out.Sym = obj.Linklookup(p.linkCtxt, a.Symbol, 0)
if a.IsImmediateAddress {
// Index field says whether it's a static.
switch a.Register {
p.errorf("can't handle immediate address of %s not (SB)\n", a.Symbol)
}
}
+ out.Sym = obj.Linklookup(p.linkCtxt, a.Symbol, staticVersion(a))
} else if a.Has(addr.Register) {
// TODO: SP is tricky, and this isn't good enough.
// SP = D_SP
From: obj.Addr{
Type: int16(p.symbolType(&nameAddr)),
Index: uint8(p.arch.D_NONE),
- Sym: obj.Linklookup(p.linkCtxt, name, 0),
+ Sym: obj.Linklookup(p.linkCtxt, name, staticVersion(&nameAddr)),
Scale: flag,
},
To: obj.Addr{
From: obj.Addr{
Type: int16(p.symbolType(&nameAddr)),
Index: uint8(p.arch.D_NONE),
- Sym: obj.Linklookup(p.linkCtxt, name, 0),
+ Sym: obj.Linklookup(p.linkCtxt, name, staticVersion(&nameAddr)),
Offset: nameAddr.Offset,
Scale: scale,
},
From: obj.Addr{
Type: int16(p.symbolType(&nameAddr)),
Index: uint8(p.arch.D_NONE),
- Sym: obj.Linklookup(p.linkCtxt, name, 0),
+ Sym: obj.Linklookup(p.linkCtxt, name, staticVersion(&nameAddr)),
Offset: nameAddr.Offset,
Scale: scale,
},
To: obj.Addr{
Type: int16(p.symbolType(&nameAddr)),
Index: uint8(p.arch.D_NONE),
- Sym: obj.Linklookup(p.linkCtxt, name, 0),
+ Sym: obj.Linklookup(p.linkCtxt, name, staticVersion(&nameAddr)),
Offset: value1,
},
}
}
prog.To = obj.Addr{
Type: int16(p.arch.D_BRANCH),
- Sym: obj.Linklookup(p.linkCtxt, target.Symbol, 0),
+ Sym: obj.Linklookup(p.linkCtxt, target.Symbol, staticVersion(target)),
Index: uint8(p.arch.D_NONE),
Offset: target.Offset,
}