]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/x86: don't apply workaround for solaris to darwin
authorHiroshi Ioka <hirochachacha@gmail.com>
Sat, 5 Aug 2017 11:03:32 +0000 (20:03 +0900)
committerIan Lance Taylor <iant@golang.org>
Thu, 17 Aug 2017 00:43:00 +0000 (00:43 +0000)
Currently, we have a workaround for solaris that enforce aboslute
addressing for external symbols. However, We don't want to use the
workaround for darwin.
This CL also refactors code a little bit, because the original function
name is not appropriate now.

Updates #17490

Change-Id: Id21f9cdf33dca6a40647226be49010c2c324ee24
Reviewed-on: https://go-review.googlesource.com/54871
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/internal/obj/x86/asm6.go

index bcf9318e2e662d4ed431f1d7878b58b58acc5acc..ed8547f9ae5b7374419f50069f589a7588c91add 100644 (file)
@@ -1712,14 +1712,17 @@ var optab =
 
 var opindex [(ALAST + 1) & obj.AMask]*Optab
 
-// isextern reports whether s describes an external symbol that must avoid pc-relative addressing.
+// useAbs reports whether s describes a symbol that must avoid pc-relative addressing.
 // This happens on systems like Solaris that call .so functions instead of system calls.
 // It does not seem to be necessary for any other systems. This is probably working
 // around a Solaris-specific bug that should be fixed differently, but we don't know
 // what that bug is. And this does fix it.
-func isextern(s *obj.LSym) bool {
-       // All the Solaris dynamic imports from libc.so begin with "libc_".
-       return strings.HasPrefix(s.Name, "libc_")
+func useAbs(ctxt *obj.Link, s *obj.LSym) bool {
+       if ctxt.Headtype == objabi.Hsolaris {
+               // All the Solaris dynamic imports from libc.so begin with "libc_".
+               return strings.HasPrefix(s.Name, "libc_")
+       }
+       return ctxt.Arch.Family == sys.I386 && !ctxt.Flag_shared
 }
 
 // single-instruction no-ops of various lengths.
@@ -2299,7 +2302,7 @@ func oclass(ctxt *obj.Link, p *obj.Prog, a *obj.Addr) int {
 
                case obj.NAME_EXTERN,
                        obj.NAME_STATIC:
-                       if a.Sym != nil && isextern(a.Sym) || (ctxt.Arch.Family == sys.I386 && !ctxt.Flag_shared) {
+                       if a.Sym != nil && useAbs(ctxt, a.Sym) {
                                return Yi32
                        }
                        return Yiauto // use pc-relative addressing
@@ -2800,7 +2803,7 @@ func vaddr(ctxt *obj.Link, p *obj.Prog, a *obj.Addr, r *obj.Reloc) int64 {
                if a.Name == obj.NAME_GOTREF {
                        r.Siz = 4
                        r.Type = objabi.R_GOTPCREL
-               } else if isextern(s) || (ctxt.Arch.Family != sys.AMD64 && !ctxt.Flag_shared) {
+               } else if useAbs(ctxt, s) {
                        r.Siz = 4
                        r.Type = objabi.R_ADDR
                } else {
@@ -2883,7 +2886,7 @@ func (asmbuf *AsmBuf) asmandsz(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, a
                case obj.NAME_EXTERN,
                        obj.NAME_GOTREF,
                        obj.NAME_STATIC:
-                       if !isextern(a.Sym) && ctxt.Arch.Family == sys.AMD64 {
+                       if !useAbs(ctxt, a.Sym) && ctxt.Arch.Family == sys.AMD64 {
                                goto bad
                        }
                        if ctxt.Arch.Family == sys.I386 && ctxt.Flag_shared {
@@ -2953,7 +2956,7 @@ func (asmbuf *AsmBuf) asmandsz(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, a
 
        asmbuf.rexflag |= regrex[base]&Rxb | rex
        if base == REG_NONE || (REG_CS <= base && base <= REG_GS) || base == REG_TLS {
-               if (a.Sym == nil || !isextern(a.Sym)) && base == REG_NONE && (a.Name == obj.NAME_STATIC || a.Name == obj.NAME_EXTERN || a.Name == obj.NAME_GOTREF) || ctxt.Arch.Family != sys.AMD64 {
+               if (a.Sym == nil || !useAbs(ctxt, a.Sym)) && base == REG_NONE && (a.Name == obj.NAME_STATIC || a.Name == obj.NAME_EXTERN || a.Name == obj.NAME_GOTREF) || ctxt.Arch.Family != sys.AMD64 {
                        if a.Name == obj.NAME_GOTREF && (a.Offset != 0 || a.Index != 0 || a.Scale != 0) {
                                ctxt.Diag("%v has offset against gotref", p)
                        }