aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/obj/arm64
diff options
context:
space:
mode:
authorShenghou Ma <minux@golang.org>2015-04-03 04:37:18 -0400
committerMinux Ma <minux@golang.org>2015-04-08 09:07:48 +0000
commit6e3a2a3f9fcd476a50ec75f7dd2db7adfe12ab57 (patch)
treeee63c976c3c923eb63c19c7e498c16b622af6633 /src/cmd/internal/obj/arm64
parentf55b2a11f488630af08a285eed1ec2f78b0d218b (diff)
downloadgo-6e3a2a3f9fcd476a50ec75f7dd2db7adfe12ab57.tar.xz
cmd/internal/obj/arm64, cmd/internal/ld, cmd/7l: remove absolute addressing in .text
This CL introduces R_ADDRARM64, which is similar to R_ADDRPOWER. Fixes #10112. Change-Id: I309e3df7608b9eef9339196fdc50dedf5f9439f1 Reviewed-on: https://go-review.googlesource.com/8438 Reviewed-by: Aram Hăvărneanu <aram@mgk.ro> Reviewed-by: David Crawshaw <crawshaw@golang.org>
Diffstat (limited to 'src/cmd/internal/obj/arm64')
-rw-r--r--src/cmd/internal/obj/arm64/asm7.go84
1 files changed, 50 insertions, 34 deletions
diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go
index e35a99efae..66780eb7c4 100644
--- a/src/cmd/internal/obj/arm64/asm7.go
+++ b/src/cmd/internal/obj/arm64/asm7.go
@@ -258,17 +258,19 @@ var optab = []Optab{
{AWORD, C_NONE, C_NONE, C_LEXT, 14, 4, 0, 0, 0},
{AWORD, C_NONE, C_NONE, C_ADDR, 14, 4, 0, 0, 0},
{AMOVW, C_VCON, C_NONE, C_REG, 12, 4, 0, LFROM, 0},
+ {AMOVW, C_VCONADDR, C_NONE, C_REG, 68, 8, 0, 0, 0},
{AMOVD, C_VCON, C_NONE, C_REG, 12, 4, 0, LFROM, 0},
- {AMOVB, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO, 0},
- {AMOVBU, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO, 0},
- {AMOVH, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO, 0},
- {AMOVW, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO, 0},
- {AMOVD, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO, 0},
- {AMOVB, C_ADDR, C_NONE, C_REG, 65, 8, 0, LFROM, 0},
- {AMOVBU, C_ADDR, C_NONE, C_REG, 65, 8, 0, LFROM, 0},
- {AMOVH, C_ADDR, C_NONE, C_REG, 65, 8, 0, LFROM, 0},
- {AMOVW, C_ADDR, C_NONE, C_REG, 65, 8, 0, LFROM, 0},
- {AMOVD, C_ADDR, C_NONE, C_REG, 65, 8, 0, LFROM, 0},
+ {AMOVD, C_VCONADDR, C_NONE, C_REG, 68, 8, 0, 0, 0},
+ {AMOVB, C_REG, C_NONE, C_ADDR, 64, 12, 0, 0, 0},
+ {AMOVBU, C_REG, C_NONE, C_ADDR, 64, 12, 0, 0, 0},
+ {AMOVH, C_REG, C_NONE, C_ADDR, 64, 12, 0, 0, 0},
+ {AMOVW, C_REG, C_NONE, C_ADDR, 64, 12, 0, 0, 0},
+ {AMOVD, C_REG, C_NONE, C_ADDR, 64, 12, 0, 0, 0},
+ {AMOVB, C_ADDR, C_NONE, C_REG, 65, 12, 0, 0, 0},
+ {AMOVBU, C_ADDR, C_NONE, C_REG, 65, 12, 0, 0, 0},
+ {AMOVH, C_ADDR, C_NONE, C_REG, 65, 12, 0, 0, 0},
+ {AMOVW, C_ADDR, C_NONE, C_REG, 65, 12, 0, 0, 0},
+ {AMOVD, C_ADDR, C_NONE, C_REG, 65, 12, 0, 0, 0},
{AMUL, C_REG, C_REG, C_REG, 15, 4, 0, 0, 0},
{AMUL, C_REG, C_NONE, C_REG, 15, 4, 0, 0, 0},
{AMADD, C_REG, C_REG, C_REG, 15, 4, 0, 0, 0},
@@ -447,10 +449,10 @@ var optab = []Optab{
{AFMOVS, C_LOREG, C_NONE, C_FREG, 31, 8, 0, LFROM, 0},
{AFMOVD, C_LAUTO, C_NONE, C_FREG, 31, 8, REGSP, LFROM, 0},
{AFMOVD, C_LOREG, C_NONE, C_FREG, 31, 8, 0, LFROM, 0},
- {AFMOVS, C_FREG, C_NONE, C_ADDR, 64, 8, 0, LTO, 0},
- {AFMOVS, C_ADDR, C_NONE, C_FREG, 65, 8, 0, LFROM, 0},
- {AFMOVD, C_FREG, C_NONE, C_ADDR, 64, 8, 0, LTO, 0},
- {AFMOVD, C_ADDR, C_NONE, C_FREG, 65, 8, 0, LFROM, 0},
+ {AFMOVS, C_FREG, C_NONE, C_ADDR, 64, 12, 0, 0, 0},
+ {AFMOVS, C_ADDR, C_NONE, C_FREG, 65, 12, 0, 0, 0},
+ {AFMOVD, C_FREG, C_NONE, C_ADDR, 64, 12, 0, 0, 0},
+ {AFMOVD, C_ADDR, C_NONE, C_FREG, 65, 12, 0, 0, 0},
{AFADDS, C_FREG, C_NONE, C_FREG, 54, 4, 0, 0, 0},
{AFADDS, C_FREG, C_FREG, C_FREG, 54, 4, 0, 0, 0},
{AFADDS, C_FCON, C_NONE, C_FREG, 54, 4, 0, 0, 0},
@@ -1176,12 +1178,7 @@ func cmp(a int, b int) bool {
}
case C_VCON:
- if b == C_VCONADDR {
- return true
- } else {
- return cmp(C_LCON, b)
- }
- fallthrough
+ return cmp(C_LCON, b)
case C_LACON:
if b == C_AACON {
@@ -2724,21 +2721,27 @@ func asmout(ctxt *obj.Link, p *obj.Prog, o *Optab, out []uint32) {
}
/* reloc ops */
- case 64: /* movT R,addr */
- o1 = omovlit(ctxt, AMOVD, p, &p.To, REGTMP)
-
- if !(o1 != 0) {
- break
- }
- o2 = olsr12u(ctxt, int32(opstr12(ctxt, int(p.As))), 0, REGTMP, int(p.From.Reg))
-
- case 65: /* movT addr,R */
- o1 = omovlit(ctxt, AMOVD, p, &p.From, REGTMP)
+ case 64: /* movT R,addr -> adrp + add + movT R, (REGTMP) */
+ o1 = ADR(1, 0, REGTMP)
+ o2 = opirr(ctxt, AADD) | REGTMP&31<<5 | REGTMP&31
+ rel := obj.Addrel(ctxt.Cursym)
+ rel.Off = int32(ctxt.Pc)
+ rel.Siz = 8
+ rel.Sym = p.To.Sym
+ rel.Add = p.To.Offset
+ rel.Type = obj.R_ADDRARM64
+ o3 = olsr12u(ctxt, int32(opstr12(ctxt, int(p.As))), 0, REGTMP, int(p.From.Reg))
- if !(o1 != 0) {
- break
- }
- o2 = olsr12u(ctxt, int32(opldr12(ctxt, int(p.As))), 0, REGTMP, int(p.To.Reg))
+ case 65: /* movT addr,R -> adrp + add + movT (REGTMP), R */
+ o1 = ADR(1, 0, REGTMP)
+ o2 = opirr(ctxt, AADD) | REGTMP&31<<5 | REGTMP&31
+ rel := obj.Addrel(ctxt.Cursym)
+ rel.Off = int32(ctxt.Pc)
+ rel.Siz = 8
+ rel.Sym = p.From.Sym
+ rel.Add = p.From.Offset
+ rel.Type = obj.R_ADDRARM64
+ o3 = olsr12u(ctxt, int32(opldr12(ctxt, int(p.As))), 0, REGTMP, int(p.To.Reg))
case 66: /* ldp O(R)!, (r1, r2); ldp (R)O!, (r1, r2) */
v := int32(p.From.Offset)
@@ -2767,6 +2770,19 @@ func asmout(ctxt *obj.Link, p *obj.Prog, o *Optab, out []uint32) {
}
o1 |= uint32(int64(2<<30|5<<27|((uint32(v)/8)&0x7f)<<15) | p.From.Offset<<10 | int64(uint32(p.To.Reg&31)<<5) | int64(p.From.Reg&31))
+ case 68: /* movT $vconaddr(SB), reg -> adrp + add + reloc */
+ if p.As == AMOVW {
+ ctxt.Diag("invalid load of 32-bit address: %v", p)
+ }
+ o1 = ADR(1, 0, uint32(p.To.Reg))
+ o2 = opirr(ctxt, AADD) | uint32(p.To.Reg&31)<<5 | uint32(p.To.Reg&31)
+ rel := obj.Addrel(ctxt.Cursym)
+ rel.Off = int32(ctxt.Pc)
+ rel.Siz = 8
+ rel.Sym = p.From.Sym
+ rel.Add = p.From.Offset
+ rel.Type = obj.R_ADDRARM64
+
// This is supposed to be something that stops execution.
// It's not supposed to be reached, ever, but if it is, we'd
// like to be able to tell how we got there. Assemble as