summaryrefslogtreecommitdiff
path: root/vendor/golang.org/x/arch/x86
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/golang.org/x/arch/x86')
-rw-r--r--vendor/golang.org/x/arch/x86/x86asm/gnu.go12
-rw-r--r--vendor/golang.org/x/arch/x86/x86asm/intel.go12
-rw-r--r--vendor/golang.org/x/arch/x86/x86asm/plan9x.go21
3 files changed, 30 insertions, 15 deletions
diff --git a/vendor/golang.org/x/arch/x86/x86asm/gnu.go b/vendor/golang.org/x/arch/x86/x86asm/gnu.go
index 8eba1fd0c..864f32c12 100644
--- a/vendor/golang.org/x/arch/x86/x86asm/gnu.go
+++ b/vendor/golang.org/x/arch/x86/x86asm/gnu.go
@@ -667,12 +667,14 @@ func gnuArg(inst *Inst, pc uint64, symname SymLookup, x Arg, usedPrefixes *bool)
}
}
case Imm:
- if s, base := symname(uint64(x)); s != "" {
- suffix := ""
- if uint64(x) != base {
- suffix = fmt.Sprintf("%+d", uint64(x)-base)
+ if (inst.Op == MOV || inst.Op == PUSH) && inst.DataSize == 32 { // See comment in plan9x.go.
+ if s, base := symname(uint64(x)); s != "" {
+ suffix := ""
+ if uint64(x) != base {
+ suffix = fmt.Sprintf("%+d", uint64(x)-base)
+ }
+ return fmt.Sprintf("$%s%s", s, suffix)
}
- return fmt.Sprintf("$%s%s", s, suffix)
}
if inst.Mode == 32 {
return fmt.Sprintf("$%#x", uint32(x))
diff --git a/vendor/golang.org/x/arch/x86/x86asm/intel.go b/vendor/golang.org/x/arch/x86/x86asm/intel.go
index 472eabda8..a0622998c 100644
--- a/vendor/golang.org/x/arch/x86/x86asm/intel.go
+++ b/vendor/golang.org/x/arch/x86/x86asm/intel.go
@@ -341,12 +341,14 @@ func IntelSyntax(inst Inst, pc uint64, symname SymLookup) string {
func intelArg(inst *Inst, pc uint64, symname SymLookup, arg Arg) string {
switch a := arg.(type) {
case Imm:
- if s, base := symname(uint64(a)); s != "" {
- suffix := ""
- if uint64(a) != base {
- suffix = fmt.Sprintf("%+d", uint64(a)-base)
+ if (inst.Op == MOV || inst.Op == PUSH) && inst.DataSize == 32 { // See comment in plan9x.go.
+ if s, base := symname(uint64(a)); s != "" {
+ suffix := ""
+ if uint64(a) != base {
+ suffix = fmt.Sprintf("%+d", uint64(a)-base)
+ }
+ return fmt.Sprintf("$%s%s", s, suffix)
}
- return fmt.Sprintf("$%s%s", s, suffix)
}
if inst.Mode == 32 {
return fmt.Sprintf("%#x", uint32(a))
diff --git a/vendor/golang.org/x/arch/x86/x86asm/plan9x.go b/vendor/golang.org/x/arch/x86/x86asm/plan9x.go
index 9e866d87b..e82349cef 100644
--- a/vendor/golang.org/x/arch/x86/x86asm/plan9x.go
+++ b/vendor/golang.org/x/arch/x86/x86asm/plan9x.go
@@ -116,12 +116,23 @@ func plan9Arg(inst *Inst, pc uint64, symname func(uint64) (string, uint64), arg
return fmt.Sprintf("%#x", addr)
case Imm:
- if s, base := symname(uint64(a)); s != "" {
- suffix := ""
- if uint64(a) != base {
- suffix = fmt.Sprintf("%+d", uint64(a)-base)
+ if (inst.Op == MOV || inst.Op == PUSH) && inst.DataSize == 32 {
+ // Only try to convert an immediate to a symbol in certain
+ // special circumstances. See issue 72942.
+ //
+ // On 64-bit, symbol addresses always hit the Mem case below.
+ // Particularly, we use LEAQ to materialize the address of
+ // a global or function.
+ //
+ // On 32-bit, we sometimes use MOVL. Still try to symbolize
+ // those immediates.
+ if s, base := symname(uint64(a)); s != "" {
+ suffix := ""
+ if uint64(a) != base {
+ suffix = fmt.Sprintf("%+d", uint64(a)-base)
+ }
+ return fmt.Sprintf("$%s%s(SB)", s, suffix)
}
- return fmt.Sprintf("$%s%s(SB)", s, suffix)
}
if inst.Mode == 32 {
return fmt.Sprintf("$%#x", uint32(a))