mirror of
https://github.com/golang/go
synced 2024-11-17 16:24:42 -07:00
cmd/compile: add Type.IsUintptr() to detect type is an uintptr
Passes toolstash-check. Change-Id: I7051d45eafbfd4dea73a3d4b5ea6cff39d76cbc1 Reviewed-on: https://go-review.googlesource.com/c/go/+/253658 Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
9cf88333e8
commit
518369601c
@ -377,7 +377,7 @@ func (e *Escape) paramTag(fn *Node, narg int, f *types.Field) string {
|
|||||||
// This really doesn't have much to do with escape analysis per se,
|
// This really doesn't have much to do with escape analysis per se,
|
||||||
// but we are reusing the ability to annotate an individual function
|
// but we are reusing the ability to annotate an individual function
|
||||||
// argument and pass those annotations along to importing code.
|
// argument and pass those annotations along to importing code.
|
||||||
if f.Type.Etype == TUINTPTR {
|
if f.Type.IsUintptr() {
|
||||||
if Debug['m'] != 0 {
|
if Debug['m'] != 0 {
|
||||||
Warnl(f.Pos, "assuming %v is unsafe uintptr", name())
|
Warnl(f.Pos, "assuming %v is unsafe uintptr", name())
|
||||||
}
|
}
|
||||||
@ -407,13 +407,13 @@ func (e *Escape) paramTag(fn *Node, narg int, f *types.Field) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if fn.Func.Pragma&UintptrEscapes != 0 {
|
if fn.Func.Pragma&UintptrEscapes != 0 {
|
||||||
if f.Type.Etype == TUINTPTR {
|
if f.Type.IsUintptr() {
|
||||||
if Debug['m'] != 0 {
|
if Debug['m'] != 0 {
|
||||||
Warnl(f.Pos, "marking %v as escaping uintptr", name())
|
Warnl(f.Pos, "marking %v as escaping uintptr", name())
|
||||||
}
|
}
|
||||||
return uintptrEscapesTag
|
return uintptrEscapesTag
|
||||||
}
|
}
|
||||||
if f.IsDDD() && f.Type.Elem().Etype == TUINTPTR {
|
if f.IsDDD() && f.Type.Elem().IsUintptr() {
|
||||||
// final argument is ...uintptr.
|
// final argument is ...uintptr.
|
||||||
if Debug['m'] != 0 {
|
if Debug['m'] != 0 {
|
||||||
Warnl(f.Pos, "marking %v as escaping ...uintptr", name())
|
Warnl(f.Pos, "marking %v as escaping ...uintptr", name())
|
||||||
|
@ -493,7 +493,7 @@ func (e *Escape) exprSkipInit(k EscHole, n *Node) {
|
|||||||
// easily detect object boundaries on the heap
|
// easily detect object boundaries on the heap
|
||||||
// than the stack.
|
// than the stack.
|
||||||
e.assignHeap(n.Left, "conversion to unsafe.Pointer", n)
|
e.assignHeap(n.Left, "conversion to unsafe.Pointer", n)
|
||||||
} else if n.Type.IsUnsafePtr() && n.Left.Type.Etype == TUINTPTR {
|
} else if n.Type.IsUnsafePtr() && n.Left.Type.IsUintptr() {
|
||||||
e.unsafeValue(k, n.Left)
|
e.unsafeValue(k, n.Left)
|
||||||
} else {
|
} else {
|
||||||
e.expr(k, n.Left)
|
e.expr(k, n.Left)
|
||||||
|
@ -781,12 +781,12 @@ func convertop(srcConstant bool, src, dst *types.Type, why *string) Op {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 8. src is a pointer or uintptr and dst is unsafe.Pointer.
|
// 8. src is a pointer or uintptr and dst is unsafe.Pointer.
|
||||||
if (src.IsPtr() || src.Etype == TUINTPTR) && dst.IsUnsafePtr() {
|
if (src.IsPtr() || src.IsUintptr()) && dst.IsUnsafePtr() {
|
||||||
return OCONVNOP
|
return OCONVNOP
|
||||||
}
|
}
|
||||||
|
|
||||||
// 9. src is unsafe.Pointer and dst is a pointer or uintptr.
|
// 9. src is unsafe.Pointer and dst is a pointer or uintptr.
|
||||||
if src.IsUnsafePtr() && (dst.IsPtr() || dst.Etype == TUINTPTR) {
|
if src.IsUnsafePtr() && (dst.IsPtr() || dst.IsUintptr()) {
|
||||||
return OCONVNOP
|
return OCONVNOP
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -962,7 +962,7 @@ opswitch:
|
|||||||
n = walkCheckPtrAlignment(n, init, nil)
|
n = walkCheckPtrAlignment(n, init, nil)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if n.Type.IsUnsafePtr() && n.Left.Type.Etype == TUINTPTR { // uintptr to unsafe.Pointer
|
if n.Type.IsUnsafePtr() && n.Left.Type.IsUintptr() { // uintptr to unsafe.Pointer
|
||||||
n = walkCheckPtrArithmetic(n, init)
|
n = walkCheckPtrArithmetic(n, init)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -3886,7 +3886,7 @@ func wrapCall(n *Node, init *Nodes) *Node {
|
|||||||
t := nod(OTFUNC, nil, nil)
|
t := nod(OTFUNC, nil, nil)
|
||||||
for i, arg := range n.List.Slice() {
|
for i, arg := range n.List.Slice() {
|
||||||
s := lookupN("a", i)
|
s := lookupN("a", i)
|
||||||
if !isBuiltinCall && arg.Op == OCONVNOP && arg.Type.Etype == TUINTPTR && arg.Left.Type.IsUnsafePtr() {
|
if !isBuiltinCall && arg.Op == OCONVNOP && arg.Type.IsUintptr() && arg.Left.Type.IsUnsafePtr() {
|
||||||
origArgs[i] = arg
|
origArgs[i] = arg
|
||||||
arg = arg.Left
|
arg = arg.Left
|
||||||
n.List.SetIndex(i, arg)
|
n.List.SetIndex(i, arg)
|
||||||
|
@ -1230,6 +1230,11 @@ func (t *Type) IsUnsafePtr() bool {
|
|||||||
return t.Etype == TUNSAFEPTR
|
return t.Etype == TUNSAFEPTR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsUintptr reports whether t is an uintptr.
|
||||||
|
func (t *Type) IsUintptr() bool {
|
||||||
|
return t.Etype == TUINTPTR
|
||||||
|
}
|
||||||
|
|
||||||
// IsPtrShaped reports whether t is represented by a single machine pointer.
|
// IsPtrShaped reports whether t is represented by a single machine pointer.
|
||||||
// In addition to regular Go pointer types, this includes map, channel, and
|
// In addition to regular Go pointer types, this includes map, channel, and
|
||||||
// function types and unsafe.Pointer. It does not include array or struct types
|
// function types and unsafe.Pointer. It does not include array or struct types
|
||||||
|
Loading…
Reference in New Issue
Block a user