diff options
| author | Matthew Dempsky <mdempsky@google.com> | 2017-04-18 12:53:25 -0700 |
|---|---|---|
| committer | Matthew Dempsky <mdempsky@google.com> | 2017-04-19 00:00:09 +0000 |
| commit | 1e3570ac86f6aeb7f8ce70b5ad236a5dd92ec804 (patch) | |
| tree | 6bb1e704f068dee9f7e95eb0d1b5ed1829441c8b /src/cmd/internal/obj/arm | |
| parent | f71f32e5e155ae5b7f60005c939746637086f30e (diff) | |
| download | go-1e3570ac86f6aeb7f8ce70b5ad236a5dd92ec804.tar.xz | |
cmd/internal/objabi: extract shared functionality from obj
Now only cmd/asm and cmd/compile depend on cmd/internal/obj. Changing
the assembler backends no longer requires reinstalling cmd/link or
cmd/addr2line.
There's also now one canonical definition of the object file format in
cmd/internal/objabi/doc.go, with a warning to update all three
implementations.
objabi is still something of a grab bag of unrelated code (e.g., flag
and environment variable handling probably belong in a separate "tool"
package), but this is still progress.
Fixes #15165.
Fixes #20026.
Change-Id: Ic4b92fac7d0d35438e0d20c9579aad4085c5534c
Reviewed-on: https://go-review.googlesource.com/40972
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
Diffstat (limited to 'src/cmd/internal/obj/arm')
| -rw-r--r-- | src/cmd/internal/obj/arm/asm5.go | 31 | ||||
| -rw-r--r-- | src/cmd/internal/obj/arm/obj5.go | 21 |
2 files changed, 27 insertions, 25 deletions
diff --git a/src/cmd/internal/obj/arm/asm5.go b/src/cmd/internal/obj/arm/asm5.go index 4725737b2b..4476439350 100644 --- a/src/cmd/internal/obj/arm/asm5.go +++ b/src/cmd/internal/obj/arm/asm5.go @@ -32,6 +32,7 @@ package arm import ( "cmd/internal/obj" + "cmd/internal/objabi" "fmt" "log" "math" @@ -602,7 +603,7 @@ func span5(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p.Pc = int64(pc) o = c.oplook(p) - if ctxt.Headtype != obj.Hnacl { + if ctxt.Headtype != objabi.Hnacl { m = int(o.size) } else { m = c.asmoutnacl(pc, p, o, nil) @@ -696,7 +697,7 @@ func span5(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { */ opc = int32(p.Pc) - if ctxt.Headtype != obj.Hnacl { + if ctxt.Headtype != objabi.Hnacl { m = int(o.size) } else { m = c.asmoutnacl(pc, p, o, nil) @@ -756,7 +757,7 @@ func span5(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { c.pc = p.Pc o = c.oplook(p) opc = int32(p.Pc) - if ctxt.Headtype != obj.Hnacl { + if ctxt.Headtype != objabi.Hnacl { c.asmout(p, o, out[:]) m = int(o.size) } else { @@ -834,7 +835,7 @@ func (c *ctxt5) flushpool(p *obj.Prog, skip int, force int) bool { } else if force == 0 && (p.Pc+int64(12+c.pool.size)-int64(c.pool.start) < 2048) { // 12 take into account the maximum nacl literal pool alignment padding size return false } - if c.ctxt.Headtype == obj.Hnacl && c.pool.size%16 != 0 { + if c.ctxt.Headtype == objabi.Hnacl && c.pool.size%16 != 0 { // if pool is not multiple of 16 bytes, add an alignment marker q := c.newprog() @@ -902,7 +903,7 @@ func (c *ctxt5) addpool(p *obj.Prog, a *obj.Addr) { } } - if c.ctxt.Headtype == obj.Hnacl && c.pool.size%16 == 0 { + if c.ctxt.Headtype == objabi.Hnacl && c.pool.size%16 == 0 { // start a new data bundle q := c.newprog() q.As = ADATABUNDLE @@ -1019,7 +1020,7 @@ func (c *ctxt5) aclass(a *obj.Addr) int { } c.instoffset = 0 // s.b. unused but just in case - if a.Sym.Type == obj.STLSBSS { + if a.Sym.Type == objabi.STLSBSS { if c.ctxt.Flag_shared { return C_TLS_IE } else { @@ -1584,7 +1585,7 @@ func (c *ctxt5) asmout(p *obj.Prog, o *Optab, out []uint32) { rel.Sym = p.To.Sym v += int32(p.To.Offset) rel.Add = int64(o1) | (int64(v)>>2)&0xffffff - rel.Type = obj.R_CALLARM + rel.Type = objabi.R_CALLARM break } @@ -1612,7 +1613,7 @@ func (c *ctxt5) asmout(p *obj.Prog, o *Optab, out []uint32) { rel := obj.Addrel(c.cursym) rel.Off = int32(c.pc) rel.Siz = 0 - rel.Type = obj.R_CALLIND + rel.Type = objabi.R_CALLIND case 8: /* sll $c,[R],R -> mov (R<<$c),R */ c.aclass(&p.From) @@ -1661,13 +1662,13 @@ func (c *ctxt5) asmout(p *obj.Prog, o *Optab, out []uint32) { if c.ctxt.Flag_shared { if p.To.Name == obj.NAME_GOTREF { - rel.Type = obj.R_GOTPCREL + rel.Type = objabi.R_GOTPCREL } else { - rel.Type = obj.R_PCREL + rel.Type = objabi.R_PCREL } rel.Add += c.pc - p.Rel.Pc - 8 } else { - rel.Type = obj.R_ADDR + rel.Type = objabi.R_ADDR } o1 = 0 } @@ -2080,7 +2081,7 @@ func (c *ctxt5) asmout(p *obj.Prog, o *Optab, out []uint32) { rel.Off = int32(c.pc) rel.Siz = 4 rel.Sym = p.To.Sym - rel.Type = obj.R_TLS_LE + rel.Type = objabi.R_TLS_LE o1 = 0 case 104: /* word tlsvar, initial exec */ @@ -2094,7 +2095,7 @@ func (c *ctxt5) asmout(p *obj.Prog, o *Optab, out []uint32) { rel.Off = int32(c.pc) rel.Siz = 4 rel.Sym = p.To.Sym - rel.Type = obj.R_TLS_IE + rel.Type = objabi.R_TLS_IE rel.Add = c.pc - p.Rel.Pc - 8 - int64(rel.Siz) case 68: /* floating point store -> ADDR */ @@ -2849,7 +2850,7 @@ func (c *ctxt5) omvl(p *obj.Prog, a *obj.Addr, dr int) uint32 { func (c *ctxt5) chipzero5(e float64) int { // We use GOARM=7 to gate the use of VFPv3 vmov (imm) instructions. - if obj.GOARM < 7 || e != 0 { + if objabi.GOARM < 7 || e != 0 { return -1 } return 0 @@ -2857,7 +2858,7 @@ func (c *ctxt5) chipzero5(e float64) int { func (c *ctxt5) chipfloat5(e float64) int { // We use GOARM=7 to gate the use of VFPv3 vmov (imm) instructions. - if obj.GOARM < 7 { + if objabi.GOARM < 7 { return -1 } diff --git a/src/cmd/internal/obj/arm/obj5.go b/src/cmd/internal/obj/arm/obj5.go index cb34d16705..49a24c9b5f 100644 --- a/src/cmd/internal/obj/arm/obj5.go +++ b/src/cmd/internal/obj/arm/obj5.go @@ -32,6 +32,7 @@ package arm import ( "cmd/internal/obj" + "cmd/internal/objabi" "cmd/internal/sys" ) @@ -62,7 +63,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) { ctxt.Diag("%v: TLS MRC instruction must write to R0 as it might get translated into a BL instruction", p.Line()) } - if obj.GOARM < 7 { + if objabi.GOARM < 7 { // Replace it with BL runtime.read_tls_fallback(SB) for ARM CPUs that lack the tls extension. if progedit_tlsfallback == nil { progedit_tlsfallback = ctxt.Lookup("runtime.read_tls_fallback", 0) @@ -205,7 +206,7 @@ func (c *ctxt5) rewriteToUseGot(p *obj.Prog) { if p.As == obj.ATEXT || p.As == obj.AFUNCDATA || p.As == obj.ACALL || p.As == obj.ARET || p.As == obj.AJMP { return } - if source.Sym.Type == obj.STLSBSS { + if source.Sym.Type == objabi.STLSBSS { return } if source.Type != obj.TYPE_MEM { @@ -632,7 +633,7 @@ func isfloatreg(a *obj.Addr) bool { } func (c *ctxt5) softfloat() { - if obj.GOARM > 5 { + if objabi.GOARM > 5 { return } @@ -722,7 +723,7 @@ func (c *ctxt5) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { p.To.Type = obj.TYPE_REG p.To.Reg = REG_R1 - if framesize <= obj.StackSmall { + if framesize <= objabi.StackSmall { // small stack: SP < stackguard // CMP stackguard, SP p = obj.Appendp(p, c.newprog) @@ -731,7 +732,7 @@ func (c *ctxt5) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { p.From.Type = obj.TYPE_REG p.From.Reg = REG_R1 p.Reg = REGSP - } else if framesize <= obj.StackBig { + } else if framesize <= objabi.StackBig { // large stack: SP-framesize < stackguard-StackSmall // MOVW $-(framesize-StackSmall)(SP), R2 // CMP stackguard, R2 @@ -740,7 +741,7 @@ func (c *ctxt5) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { p.As = AMOVW p.From.Type = obj.TYPE_ADDR p.From.Reg = REGSP - p.From.Offset = -(int64(framesize) - obj.StackSmall) + p.From.Offset = -(int64(framesize) - objabi.StackSmall) p.To.Type = obj.TYPE_REG p.To.Reg = REG_R2 @@ -764,14 +765,14 @@ func (c *ctxt5) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { p.As = ACMP p.From.Type = obj.TYPE_CONST - p.From.Offset = int64(uint32(obj.StackPreempt & (1<<32 - 1))) + p.From.Offset = int64(uint32(objabi.StackPreempt & (1<<32 - 1))) p.Reg = REG_R1 p = obj.Appendp(p, c.newprog) p.As = AMOVW p.From.Type = obj.TYPE_ADDR p.From.Reg = REGSP - p.From.Offset = obj.StackGuard + p.From.Offset = objabi.StackGuard p.To.Type = obj.TYPE_REG p.To.Reg = REG_R2 p.Scond = C_SCOND_NE @@ -787,7 +788,7 @@ func (c *ctxt5) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { p = obj.Appendp(p, c.newprog) p.As = AMOVW p.From.Type = obj.TYPE_ADDR - p.From.Offset = int64(framesize) + (obj.StackGuard - obj.StackSmall) + p.From.Offset = int64(framesize) + (objabi.StackGuard - objabi.StackSmall) p.To.Type = obj.TYPE_REG p.To.Reg = REG_R3 p.Scond = C_SCOND_NE @@ -820,7 +821,7 @@ func (c *ctxt5) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { pcdata.Pos = c.cursym.Func.Text.Pos pcdata.As = obj.APCDATA pcdata.From.Type = obj.TYPE_CONST - pcdata.From.Offset = obj.PCDATA_StackMapIndex + pcdata.From.Offset = objabi.PCDATA_StackMapIndex pcdata.To.Type = obj.TYPE_CONST pcdata.To.Offset = -1 // pcdata starts at -1 at function entry |
