aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/runtime1.go
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2016-05-05 14:24:16 -0700
committerKeith Randall <khr@golang.org>2016-05-05 14:24:52 -0700
commit802966f7b3827d0e462742293c259a2c1408595d (patch)
tree7da75ee5e570638275b83fb5e5ff94ea059cf012 /src/runtime/runtime1.go
parentab150e1ac93b720b4591d618e4fe35988044ee54 (diff)
parent9b05ae612a4496df317e3c1c770b4b9c5648616d (diff)
downloadgo-802966f7b3827d0e462742293c259a2c1408595d.tar.gz
go-802966f7b3827d0e462742293c259a2c1408595d.zip
[dev.ssa] Merge remote-tracking branch 'origin/master' into mergebranch
Merge from tip into ssa. Change-Id: Icbc1c46d9f4721e4a0f99a24dd708044407ee9f7
Diffstat (limited to 'src/runtime/runtime1.go')
-rw-r--r--src/runtime/runtime1.go51
1 files changed, 46 insertions, 5 deletions
diff --git a/src/runtime/runtime1.go b/src/runtime/runtime1.go
index d25042da41..e19c7fe932 100644
--- a/src/runtime/runtime1.go
+++ b/src/runtime/runtime1.go
@@ -76,7 +76,7 @@ func goargs() {
func goenvs_unix() {
// TODO(austin): ppc64 in dynamic linking mode doesn't
- // guarantee env[] will immediately follow argv. Might cause
+ // guarantee env[] will immediately follow argv. Might cause
// problems.
n := int32(0)
for argv_index(argv, argc+1+n) != nil {
@@ -241,7 +241,7 @@ func check() {
k = unsafe.Pointer(uintptr(0xfedcb123))
if sys.PtrSize == 8 {
- k = unsafe.Pointer(uintptr(unsafe.Pointer(k)) << 10)
+ k = unsafe.Pointer(uintptr(k) << 10)
}
if casp(&k, nil, nil) {
throw("casp1")
@@ -476,10 +476,51 @@ func gomcache() *mcache {
}
//go:linkname reflect_typelinks reflect.typelinks
-func reflect_typelinks() [][]*_type {
- ret := [][]*_type{firstmoduledata.typelinks}
+func reflect_typelinks() ([]unsafe.Pointer, [][]int32) {
+ sections := []unsafe.Pointer{unsafe.Pointer(firstmoduledata.types)}
+ ret := [][]int32{firstmoduledata.typelinks}
for datap := firstmoduledata.next; datap != nil; datap = datap.next {
+ sections = append(sections, unsafe.Pointer(datap.types))
ret = append(ret, datap.typelinks)
}
- return ret
+ return sections, ret
+}
+
+// reflect_resolveNameOff resolves a name offset from a base pointer.
+//go:linkname reflect_resolveNameOff reflect.resolveNameOff
+func reflect_resolveNameOff(ptrInModule unsafe.Pointer, off int32) unsafe.Pointer {
+ return unsafe.Pointer(resolveNameOff(ptrInModule, nameOff(off)).bytes)
+}
+
+// reflect_resolveTypeOff resolves an *rtype offset from a base type.
+//go:linkname reflect_resolveTypeOff reflect.resolveTypeOff
+func reflect_resolveTypeOff(rtype unsafe.Pointer, off int32) unsafe.Pointer {
+ return unsafe.Pointer((*_type)(rtype).typeOff(typeOff(off)))
+}
+
+// reflect_resolveTextOff resolves an function pointer offset from a base type.
+//go:linkname reflect_resolveTextOff reflect.resolveTextOff
+func reflect_resolveTextOff(rtype unsafe.Pointer, off int32) unsafe.Pointer {
+ return (*_type)(rtype).textOff(textOff(off))
+
+}
+
+// reflect_addReflectOff adds a pointer to the reflection offset lookup map.
+//go:linkname reflect_addReflectOff reflect.addReflectOff
+func reflect_addReflectOff(ptr unsafe.Pointer) int32 {
+ lock(&reflectOffs.lock)
+ if reflectOffs.m == nil {
+ reflectOffs.m = make(map[int32]unsafe.Pointer)
+ reflectOffs.minv = make(map[unsafe.Pointer]int32)
+ reflectOffs.next = -1
+ }
+ id, found := reflectOffs.minv[ptr]
+ if !found {
+ id = reflectOffs.next
+ reflectOffs.next-- // use negative offsets as IDs to aid debugging
+ reflectOffs.m[id] = ptr
+ reflectOffs.minv[ptr] = id
+ }
+ unlock(&reflectOffs.lock)
+ return id
}