libgo: support for sparc64 GNU/Linux

Fix lfstack code to work with sparc64 GNU/Linux address map.
    
    Force alignment of epollevent.  To make this work reliably, pass
    GOARCH explicitly to mkrsysinfo.sh.
    
    Patch by Vladimir Mezentsev.
    
    Reviewed-on: https://go-review.googlesource.com/44494

From-SVN: r248765
This commit is contained in:
Ian Lance Taylor 2017-05-31 21:36:42 +00:00
parent 4f14911c80
commit 30bc05cfcb
5 changed files with 20 additions and 4 deletions

View File

@ -1,4 +1,4 @@
884df09c3da0f39309ab13f2ad401628fb933050 e5870eac67d4d5b1f86bdbfb13dadf4d5723f71d
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.

View File

@ -531,7 +531,7 @@ s-version: Makefile
runtime_sysinfo.go: s-runtime_sysinfo; @true runtime_sysinfo.go: s-runtime_sysinfo; @true
s-runtime_sysinfo: $(srcdir)/mkrsysinfo.sh gen-sysinfo.go s-runtime_sysinfo: $(srcdir)/mkrsysinfo.sh gen-sysinfo.go
GOOS=$(GOOS) $(SHELL) $(srcdir)/mkrsysinfo.sh GOARCH=$(GOARCH) GOOS=$(GOOS) $(SHELL) $(srcdir)/mkrsysinfo.sh
$(SHELL) $(srcdir)/mvifdiff.sh tmp-runtime_sysinfo.go runtime_sysinfo.go $(SHELL) $(srcdir)/mvifdiff.sh tmp-runtime_sysinfo.go runtime_sysinfo.go
$(STAMP) $@ $(STAMP) $@

View File

@ -3081,7 +3081,7 @@ s-version: Makefile
runtime_sysinfo.go: s-runtime_sysinfo; @true runtime_sysinfo.go: s-runtime_sysinfo; @true
s-runtime_sysinfo: $(srcdir)/mkrsysinfo.sh gen-sysinfo.go s-runtime_sysinfo: $(srcdir)/mkrsysinfo.sh gen-sysinfo.go
GOOS=$(GOOS) $(SHELL) $(srcdir)/mkrsysinfo.sh GOARCH=$(GOARCH) GOOS=$(GOOS) $(SHELL) $(srcdir)/mkrsysinfo.sh
$(SHELL) $(srcdir)/mvifdiff.sh tmp-runtime_sysinfo.go runtime_sysinfo.go $(SHELL) $(srcdir)/mvifdiff.sh tmp-runtime_sysinfo.go runtime_sysinfo.go
$(STAMP) $@ $(STAMP) $@

View File

@ -32,9 +32,18 @@ const (
// bottom, because node must be pointer-aligned, giving a total of 19 bits // bottom, because node must be pointer-aligned, giving a total of 19 bits
// of count. // of count.
cntBits = 64 - addrBits + 3 cntBits = 64 - addrBits + 3
// On sparc64-linux, user addresses are 52-bit numbers sign extended to 64.
// We shift the address left 12 to eliminate the sign extended part and make
// room in the bottom for the count.
sparcLinuxAddrBits = 52
sparcLinuxCntBits = 64 - sparcLinuxAddrBits + 3
) )
func lfstackPack(node *lfnode, cnt uintptr) uint64 { func lfstackPack(node *lfnode, cnt uintptr) uint64 {
if GOARCH == "sparc64" && GOOS == "linux" {
return uint64(uintptr(unsafe.Pointer(node)))<<(64-sparcLinuxAddrBits) | uint64(cnt&(1<<sparcLinuxCntBits-1))
}
return uint64(uintptr(unsafe.Pointer(node)))<<(64-addrBits) | uint64(cnt&(1<<cntBits-1)) return uint64(uintptr(unsafe.Pointer(node)))<<(64-addrBits) | uint64(cnt&(1<<cntBits-1))
} }
@ -44,5 +53,8 @@ func lfstackUnpack(val uint64) *lfnode {
// val before unpacking. // val before unpacking.
return (*lfnode)(unsafe.Pointer(uintptr(int64(val) >> cntBits << 3))) return (*lfnode)(unsafe.Pointer(uintptr(int64(val) >> cntBits << 3)))
} }
if GOARCH == "sparc64" && GOOS == "linux" {
return (*lfnode)(unsafe.Pointer(uintptr(int64(val) >> sparcLinuxCntBits << 3)))
}
return (*lfnode)(unsafe.Pointer(uintptr(val >> cntBits << 3))) return (*lfnode)(unsafe.Pointer(uintptr(val >> cntBits << 3)))
} }

View File

@ -83,7 +83,11 @@ if grep '^const _epoll_data_offset ' ${OUT} >/dev/null 2>&1; then
if test "$val" = "4"; then if test "$val" = "4"; then
echo 'type epollevent struct { events uint32; data [8]byte }' >> ${OUT} echo 'type epollevent struct { events uint32; data [8]byte }' >> ${OUT}
elif test "$val" = "8"; then elif test "$val" = "8"; then
echo 'type epollevent struct { events uint32; pad [4]byte; data [8]byte }' >> ${OUT} if test "$GOARCH" = "sparc64" -a "$GOOS" = "linux"; then
echo 'type epollevent struct { events uint32; pad [4]byte; data [8]byte; _align [0]int64 }' >> ${OUT}
else
echo 'type epollevent struct { events uint32; pad [4]byte; data [8]byte }' >> ${OUT}
fi
else else
echo 1>&2 "unknown epoll data offset value ${val}" echo 1>&2 "unknown epoll data offset value ${val}"
exit 1 exit 1