Commit 1eed80f0 authored by Keith Randall's avatar Keith Randall

cmd/compile: fix disassembly of invalid instructions

Make sure that if we encode an explicit base register, we print it.
That will ensure that if we make an Addr with an auto variable but
a base that isn't SP, then it will be obvious from the disassembly.

Update #19184

Change-Id: If5556a5183f344d719ec7197aa935a0166061e6f
Reviewed-on: https://go-review.googlesource.com/37255Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
parent ffe923f6
...@@ -312,39 +312,60 @@ func Mconv(a *Addr) string { ...@@ -312,39 +312,60 @@ func Mconv(a *Addr) string {
str = fmt.Sprintf("%d(%v)", a.Offset, Rconv(int(a.Reg))) str = fmt.Sprintf("%d(%v)", a.Offset, Rconv(int(a.Reg)))
} }
// Note: a.Reg == REG_NONE encodes the default base register for the NAME_ type.
case NAME_EXTERN: case NAME_EXTERN:
reg := "SB"
if a.Reg != REG_NONE {
reg = Rconv(int(a.Reg))
}
if a.Sym != nil { if a.Sym != nil {
str = fmt.Sprintf("%s%s(SB)", a.Sym.Name, offConv(a.Offset)) str = fmt.Sprintf("%s%s(%s)", a.Sym.Name, offConv(a.Offset), reg)
} else { } else {
str = fmt.Sprintf("%s(SB)", offConv(a.Offset)) str = fmt.Sprintf("%s(%s)", offConv(a.Offset), reg)
} }
case NAME_GOTREF: case NAME_GOTREF:
reg := "SB"
if a.Reg != REG_NONE {
reg = Rconv(int(a.Reg))
}
if a.Sym != nil { if a.Sym != nil {
str = fmt.Sprintf("%s%s@GOT(SB)", a.Sym.Name, offConv(a.Offset)) str = fmt.Sprintf("%s%s@GOT(%s)", a.Sym.Name, offConv(a.Offset), reg)
} else { } else {
str = fmt.Sprintf("%s@GOT(SB)", offConv(a.Offset)) str = fmt.Sprintf("%s@GOT(%s)", offConv(a.Offset), reg)
} }
case NAME_STATIC: case NAME_STATIC:
reg := "SB"
if a.Reg != REG_NONE {
reg = Rconv(int(a.Reg))
}
if a.Sym != nil { if a.Sym != nil {
str = fmt.Sprintf("%s<>%s(SB)", a.Sym.Name, offConv(a.Offset)) str = fmt.Sprintf("%s<>%s(%s)", a.Sym.Name, offConv(a.Offset), reg)
} else { } else {
str = fmt.Sprintf("<>%s(SB)", offConv(a.Offset)) str = fmt.Sprintf("<>%s(%s)", offConv(a.Offset), reg)
} }
case NAME_AUTO: case NAME_AUTO:
reg := "SP"
if a.Reg != REG_NONE {
reg = Rconv(int(a.Reg))
}
if a.Sym != nil { if a.Sym != nil {
str = fmt.Sprintf("%s%s(SP)", a.Sym.Name, offConv(a.Offset)) str = fmt.Sprintf("%s%s(%s)", a.Sym.Name, offConv(a.Offset), reg)
} else { } else {
str = fmt.Sprintf("%s(SP)", offConv(a.Offset)) str = fmt.Sprintf("%s(%s)", offConv(a.Offset), reg)
} }
case NAME_PARAM: case NAME_PARAM:
reg := "FP"
if a.Reg != REG_NONE {
reg = Rconv(int(a.Reg))
}
if a.Sym != nil { if a.Sym != nil {
str = fmt.Sprintf("%s%s(FP)", a.Sym.Name, offConv(a.Offset)) str = fmt.Sprintf("%s%s(%s)", a.Sym.Name, offConv(a.Offset), reg)
} else { } else {
str = fmt.Sprintf("%s(FP)", offConv(a.Offset)) str = fmt.Sprintf("%s(%s)", offConv(a.Offset), reg)
} }
} }
return str return str
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment