From 076d34d1c0f487e8198708f81597ee572c74e8ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aram=20H=C4=83v=C4=83rneanu?= Date: Thu, 29 Jan 2015 12:51:06 +0100 Subject: [PATCH] liblink, cmd/7a: add C_VCONADDR class This change adds the C_VCONADDR representing $r(SB), the address of a relocatable symbol. The old C_ADDR, r(SB) without $, means data at a relocatable symbol. C_VCONADDR matches C_VCON in optab. We could have overloaded the meaning of C_VCON, but adding a new class simplifies the logic in addpool. Fixes #65 --- src/cmd/7l/7.out.h | 3 ++- src/cmd/internal/obj/arm64/7.out.go | 1 + src/cmd/internal/obj/arm64/anames7.go | 1 + src/cmd/internal/obj/arm64/asm7.go | 18 ++++++++---------- src/liblink/asm7.c | 15 +++++---------- 5 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/cmd/7l/7.out.h b/src/cmd/7l/7.out.h index 537403ee1a910..6b5e72be6743c 100644 --- a/src/cmd/7l/7.out.h +++ b/src/cmd/7l/7.out.h @@ -117,6 +117,7 @@ enum cs C_LCON, /* 32-bit constant */ C_FCON, /* floating-point constant */ C_VCON, /* 64-bit constant */ + C_VCONADDR, /* $foo(SB) reference to relocatable address */ C_AACON, /* ADDCON offset in auto constant $a(FP) */ C_LACON, /* 32-bit offset in auto constant $a(FP) */ @@ -156,7 +157,7 @@ enum cs C_UOREG64K, C_LOREG, - C_ADDR, /* relocatable address for dynamic loading */ + C_ADDR, /* foo(SB) reference to relocatable address */ C_ROFF, /* register offset (inc register extended) */ C_XPOST, C_XPRE, diff --git a/src/cmd/internal/obj/arm64/7.out.go b/src/cmd/internal/obj/arm64/7.out.go index 0866f91b4a5f2..eb0eb23254b9e 100644 --- a/src/cmd/internal/obj/arm64/7.out.go +++ b/src/cmd/internal/obj/arm64/7.out.go @@ -108,6 +108,7 @@ const ( C_LCON C_FCON C_VCON + C_VCONADDR C_AACON C_LACON C_AECON diff --git a/src/cmd/internal/obj/arm64/anames7.go b/src/cmd/internal/obj/arm64/anames7.go index cdbf5d93c4d95..c782dce36e37e 100644 --- a/src/cmd/internal/obj/arm64/anames7.go +++ b/src/cmd/internal/obj/arm64/anames7.go @@ -409,6 +409,7 @@ var cnames7 = []string{ "LCON", "FCON", "VCON", + "VCONADDR", "AACON", "LACON", "AECON", diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index 0713fcbea1670..999c0ede561d8 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -183,9 +183,6 @@ var optab = []Optab{ Optab{AADD, C_VCON, C_REG, C_REG, 13, 8, 0, LFROM}, Optab{AADD, C_VCON, C_NONE, C_REG, 13, 8, 0, LFROM}, Optab{ACMP, C_VCON, C_REG, C_NONE, 13, 8, 0, LFROM}, - Optab{AADD, C_ADDR, C_REG, C_REG, 13, 8, 0, LFROM}, - Optab{AADD, C_ADDR, C_NONE, C_REG, 13, 8, 0, LFROM}, - Optab{ACMP, C_ADDR, C_REG, C_NONE, 13, 8, 0, LFROM}, Optab{AADD, C_SHIFT, C_REG, C_REG, 3, 4, 0, 0}, Optab{AADD, C_SHIFT, C_NONE, C_REG, 3, 4, 0, 0}, Optab{AMVN, C_SHIFT, C_NONE, C_REG, 3, 4, 0, 0}, @@ -213,10 +210,6 @@ var optab = []Optab{ Optab{AAND, C_VCON, C_NONE, C_REG, 28, 8, 0, LFROM}, Optab{ABIC, C_VCON, C_REG, C_REG, 28, 8, 0, LFROM}, Optab{ABIC, C_VCON, C_NONE, C_REG, 28, 8, 0, LFROM}, - Optab{AAND, C_ADDR, C_REG, C_REG, 28, 8, 0, LFROM}, - Optab{AAND, C_ADDR, C_NONE, C_REG, 28, 8, 0, LFROM}, - Optab{ABIC, C_ADDR, C_REG, C_REG, 28, 8, 0, LFROM}, - Optab{ABIC, C_ADDR, C_NONE, C_REG, 28, 8, 0, LFROM}, Optab{AAND, C_SHIFT, C_REG, C_REG, 3, 4, 0, 0}, Optab{AAND, C_SHIFT, C_NONE, C_REG, 3, 4, 0, 0}, Optab{ABIC, C_SHIFT, C_REG, C_REG, 3, 4, 0, 0}, @@ -272,7 +265,6 @@ var optab = []Optab{ Optab{AWORD, C_NONE, C_NONE, C_ADDR, 14, 4, 0, 0}, Optab{AMOVW, C_VCON, C_NONE, C_REG, 12, 4, 0, LFROM}, Optab{AMOV, C_VCON, C_NONE, C_REG, 12, 4, 0, LFROM}, - Optab{AMOV, C_ADDR, C_NONE, C_REG, 12, 4, 0, LFROM}, Optab{AMOVB, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO}, Optab{AMOVBU, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO}, Optab{AMOVH, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO}, @@ -1138,7 +1130,7 @@ func aclass(ctxt *obj.Link, a *obj.Addr) int { break } ctxt.Instoffset = a.Offset - return C_ADDR + return C_VCONADDR case D_AUTO: ctxt.Instoffset = int64(ctxt.Autosize) + a.Offset @@ -1277,7 +1269,13 @@ func cmp(a int, b int) bool { } case C_VCON: - return cmp(C_LCON, b) + if b == C_VCONADDR { + return true + } else { + + return cmp(C_LCON, b) + } + fallthrough case C_LACON: if b == C_AACON { diff --git a/src/liblink/asm7.c b/src/liblink/asm7.c index 557831bb45ae0..d56c1527d8f1b 100644 --- a/src/liblink/asm7.c +++ b/src/liblink/asm7.c @@ -262,9 +262,6 @@ static Optab optab[] = { { AADD, C_VCON, C_REG, C_REG, 13, 8, 0, LFROM }, { AADD, C_VCON, C_NONE, C_REG, 13, 8, 0, LFROM }, { ACMP, C_VCON, C_REG, C_NONE, 13, 8, 0, LFROM }, - { AADD, C_ADDR, C_REG, C_REG, 13, 8, 0, LFROM }, - { AADD, C_ADDR, C_NONE, C_REG, 13, 8, 0, LFROM }, - { ACMP, C_ADDR, C_REG, C_NONE, 13, 8, 0, LFROM }, { AADD, C_SHIFT,C_REG, C_REG, 3, 4, 0 }, { AADD, C_SHIFT,C_NONE, C_REG, 3, 4, 0 }, @@ -297,10 +294,6 @@ static Optab optab[] = { { AAND, C_VCON, C_NONE, C_REG, 28, 8, 0, LFROM }, { ABIC, C_VCON, C_REG, C_REG, 28, 8, 0, LFROM }, { ABIC, C_VCON, C_NONE, C_REG, 28, 8, 0, LFROM }, - { AAND, C_ADDR, C_REG, C_REG, 28, 8, 0, LFROM }, - { AAND, C_ADDR, C_NONE, C_REG, 28, 8, 0, LFROM }, - { ABIC, C_ADDR, C_REG, C_REG, 28, 8, 0, LFROM }, - { ABIC, C_ADDR, C_NONE, C_REG, 28, 8, 0, LFROM }, { AAND, C_SHIFT,C_REG, C_REG, 3, 4, 0 }, { AAND, C_SHIFT,C_NONE, C_REG, 3, 4, 0 }, @@ -372,7 +365,6 @@ static Optab optab[] = { { AMOVW, C_VCON, C_NONE, C_REG, 12, 4, 0, LFROM }, { AMOV, C_VCON, C_NONE, C_REG, 12, 4, 0, LFROM }, - { AMOV, C_ADDR, C_NONE, C_REG, 12, 4, 0, LFROM }, { AMOVB, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO }, { AMOVBU, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO }, @@ -1186,7 +1178,7 @@ aclass(Link *ctxt, Addr *a) if(s == nil) break; ctxt->instoffset = a->offset; - return C_ADDR; + return C_VCONADDR; case D_AUTO: ctxt->instoffset = ctxt->autosize + a->offset; goto aconsize; @@ -1305,7 +1297,10 @@ cmp(int a, int b) return 1; break; case C_VCON: - return cmp(C_LCON, b); + if(b == C_VCONADDR) + return 1; + else + return cmp(C_LCON, b); case C_LACON: if(b == C_AACON) return 1;