[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
// Copyright 2009 The Go Authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package walk
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"go/constant"
|
|
|
|
"go/token"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"cmd/compile/internal/base"
|
|
|
|
"cmd/compile/internal/escape"
|
|
|
|
"cmd/compile/internal/ir"
|
|
|
|
"cmd/compile/internal/reflectdata"
|
|
|
|
"cmd/compile/internal/typecheck"
|
|
|
|
"cmd/compile/internal/types"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Rewrite append(src, x, y, z) so that any side effects in
|
|
|
|
// x, y, z (including runtime panics) are evaluated in
|
|
|
|
// initialization statements before the append.
|
|
|
|
// For normal code generation, stop there and leave the
|
cmd/compile,runtime: redo growslice calling convention
Instead of passing the original length and the new length, pass
the new length and the length increment. Also use the new length
in all the post-growslice calculations so that the original length
is dead and does not need to be spilled/restored around the growslice.
old: growslice(typ, oldPtr, oldLen, oldCap, newLen) (newPtr, newLen, newCap)
new: growslice(oldPtr, newLen, oldCap, inc, typ) (newPtr, newLen, newCap)
where inc = # of elements added = newLen-oldLen
Also move the element type to the end of the call. This makes register
allocation more efficient, as oldPtr and newPtr can often be in the
same register (e.g. AX on amd64) and thus the phi takes no instructions.
Makes the go binary 0.3% smaller.
Change-Id: I7295a60227dbbeecec2bf039eeef2950a72df760
Reviewed-on: https://go-review.googlesource.com/c/go/+/418554
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2022-07-13 20:22:53 -07:00
|
|
|
// rest to ssagen.
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
//
|
|
|
|
// For race detector, expand append(src, a [, b]* ) to
|
|
|
|
//
|
2022-09-06 18:39:52 +08:00
|
|
|
// init {
|
|
|
|
// s := src
|
|
|
|
// const argc = len(args) - 1
|
|
|
|
// newLen := s.len + argc
|
|
|
|
// if uint(newLen) <= uint(s.cap) {
|
|
|
|
// s = s[:newLen]
|
|
|
|
// } else {
|
|
|
|
// s = growslice(s.ptr, newLen, s.cap, argc, elemType)
|
2022-02-03 14:12:08 -05:00
|
|
|
// }
|
2022-09-06 18:39:52 +08:00
|
|
|
// s[s.len - argc] = a
|
|
|
|
// s[s.len - argc + 1] = b
|
|
|
|
// ...
|
|
|
|
// }
|
|
|
|
// s
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
func walkAppend(n *ir.CallExpr, init *ir.Nodes, dst ir.Node) ir.Node {
|
|
|
|
if !ir.SameSafeExpr(dst, n.Args[0]) {
|
|
|
|
n.Args[0] = safeExpr(n.Args[0], init)
|
|
|
|
n.Args[0] = walkExpr(n.Args[0], init)
|
|
|
|
}
|
|
|
|
walkExprListSafe(n.Args[1:], init)
|
|
|
|
|
|
|
|
nsrc := n.Args[0]
|
|
|
|
|
2021-01-15 14:12:35 -08:00
|
|
|
// walkExprListSafe will leave OINDEX (s[n]) alone if both s
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
// and n are name or literal, but those may index the slice we're
|
|
|
|
// modifying here. Fix explicitly.
|
2021-01-15 14:12:35 -08:00
|
|
|
// Using cheapExpr also makes sure that the evaluation
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
// of all arguments (and especially any panics) happen
|
|
|
|
// before we begin to modify the slice in a visible way.
|
|
|
|
ls := n.Args[1:]
|
|
|
|
for i, n := range ls {
|
|
|
|
n = cheapExpr(n, init)
|
|
|
|
if !types.Identical(n.Type(), nsrc.Type().Elem()) {
|
|
|
|
n = typecheck.AssignConv(n, nsrc.Type().Elem(), "append")
|
|
|
|
n = walkExpr(n, init)
|
|
|
|
}
|
|
|
|
ls[i] = n
|
|
|
|
}
|
|
|
|
|
|
|
|
argc := len(n.Args) - 1
|
|
|
|
if argc < 1 {
|
|
|
|
return nsrc
|
|
|
|
}
|
|
|
|
|
|
|
|
// General case, with no function calls left as arguments.
|
cmd/compile,runtime: redo growslice calling convention
Instead of passing the original length and the new length, pass
the new length and the length increment. Also use the new length
in all the post-growslice calculations so that the original length
is dead and does not need to be spilled/restored around the growslice.
old: growslice(typ, oldPtr, oldLen, oldCap, newLen) (newPtr, newLen, newCap)
new: growslice(oldPtr, newLen, oldCap, inc, typ) (newPtr, newLen, newCap)
where inc = # of elements added = newLen-oldLen
Also move the element type to the end of the call. This makes register
allocation more efficient, as oldPtr and newPtr can often be in the
same register (e.g. AX on amd64) and thus the phi takes no instructions.
Makes the go binary 0.3% smaller.
Change-Id: I7295a60227dbbeecec2bf039eeef2950a72df760
Reviewed-on: https://go-review.googlesource.com/c/go/+/418554
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2022-07-13 20:22:53 -07:00
|
|
|
// Leave for ssagen, except that instrumentation requires the old form.
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
if !base.Flag.Cfg.Instrumenting || base.Flag.CompilingRuntime {
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
|
|
|
var l []ir.Node
|
|
|
|
|
cmd/compile,runtime: redo growslice calling convention
Instead of passing the original length and the new length, pass
the new length and the length increment. Also use the new length
in all the post-growslice calculations so that the original length
is dead and does not need to be spilled/restored around the growslice.
old: growslice(typ, oldPtr, oldLen, oldCap, newLen) (newPtr, newLen, newCap)
new: growslice(oldPtr, newLen, oldCap, inc, typ) (newPtr, newLen, newCap)
where inc = # of elements added = newLen-oldLen
Also move the element type to the end of the call. This makes register
allocation more efficient, as oldPtr and newPtr can often be in the
same register (e.g. AX on amd64) and thus the phi takes no instructions.
Makes the go binary 0.3% smaller.
Change-Id: I7295a60227dbbeecec2bf039eeef2950a72df760
Reviewed-on: https://go-review.googlesource.com/c/go/+/418554
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2022-07-13 20:22:53 -07:00
|
|
|
// s = slice to append to
|
|
|
|
s := typecheck.Temp(nsrc.Type())
|
|
|
|
l = append(l, ir.NewAssignStmt(base.Pos, s, nsrc))
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
|
cmd/compile,runtime: redo growslice calling convention
Instead of passing the original length and the new length, pass
the new length and the length increment. Also use the new length
in all the post-growslice calculations so that the original length
is dead and does not need to be spilled/restored around the growslice.
old: growslice(typ, oldPtr, oldLen, oldCap, newLen) (newPtr, newLen, newCap)
new: growslice(oldPtr, newLen, oldCap, inc, typ) (newPtr, newLen, newCap)
where inc = # of elements added = newLen-oldLen
Also move the element type to the end of the call. This makes register
allocation more efficient, as oldPtr and newPtr can often be in the
same register (e.g. AX on amd64) and thus the phi takes no instructions.
Makes the go binary 0.3% smaller.
Change-Id: I7295a60227dbbeecec2bf039eeef2950a72df760
Reviewed-on: https://go-review.googlesource.com/c/go/+/418554
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2022-07-13 20:22:53 -07:00
|
|
|
// num = number of things to append
|
2023-02-28 13:27:51 -08:00
|
|
|
num := ir.NewInt(base.Pos, int64(argc))
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
|
cmd/compile,runtime: redo growslice calling convention
Instead of passing the original length and the new length, pass
the new length and the length increment. Also use the new length
in all the post-growslice calculations so that the original length
is dead and does not need to be spilled/restored around the growslice.
old: growslice(typ, oldPtr, oldLen, oldCap, newLen) (newPtr, newLen, newCap)
new: growslice(oldPtr, newLen, oldCap, inc, typ) (newPtr, newLen, newCap)
where inc = # of elements added = newLen-oldLen
Also move the element type to the end of the call. This makes register
allocation more efficient, as oldPtr and newPtr can often be in the
same register (e.g. AX on amd64) and thus the phi takes no instructions.
Makes the go binary 0.3% smaller.
Change-Id: I7295a60227dbbeecec2bf039eeef2950a72df760
Reviewed-on: https://go-review.googlesource.com/c/go/+/418554
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2022-07-13 20:22:53 -07:00
|
|
|
// newLen := s.len + num
|
|
|
|
newLen := typecheck.Temp(types.Types[types.TINT])
|
|
|
|
l = append(l, ir.NewAssignStmt(base.Pos, newLen, ir.NewBinaryExpr(base.Pos, ir.OADD, ir.NewUnaryExpr(base.Pos, ir.OLEN, s), num)))
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
|
cmd/compile,runtime: redo growslice calling convention
Instead of passing the original length and the new length, pass
the new length and the length increment. Also use the new length
in all the post-growslice calculations so that the original length
is dead and does not need to be spilled/restored around the growslice.
old: growslice(typ, oldPtr, oldLen, oldCap, newLen) (newPtr, newLen, newCap)
new: growslice(oldPtr, newLen, oldCap, inc, typ) (newPtr, newLen, newCap)
where inc = # of elements added = newLen-oldLen
Also move the element type to the end of the call. This makes register
allocation more efficient, as oldPtr and newPtr can often be in the
same register (e.g. AX on amd64) and thus the phi takes no instructions.
Makes the go binary 0.3% smaller.
Change-Id: I7295a60227dbbeecec2bf039eeef2950a72df760
Reviewed-on: https://go-review.googlesource.com/c/go/+/418554
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2022-07-13 20:22:53 -07:00
|
|
|
// if uint(newLen) <= uint(s.cap)
|
|
|
|
nif := ir.NewIfStmt(base.Pos, nil, nil, nil)
|
|
|
|
nif.Cond = ir.NewBinaryExpr(base.Pos, ir.OLE, typecheck.Conv(newLen, types.Types[types.TUINT]), typecheck.Conv(ir.NewUnaryExpr(base.Pos, ir.OCAP, s), types.Types[types.TUINT]))
|
|
|
|
nif.Likely = true
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
|
cmd/compile,runtime: redo growslice calling convention
Instead of passing the original length and the new length, pass
the new length and the length increment. Also use the new length
in all the post-growslice calculations so that the original length
is dead and does not need to be spilled/restored around the growslice.
old: growslice(typ, oldPtr, oldLen, oldCap, newLen) (newPtr, newLen, newCap)
new: growslice(oldPtr, newLen, oldCap, inc, typ) (newPtr, newLen, newCap)
where inc = # of elements added = newLen-oldLen
Also move the element type to the end of the call. This makes register
allocation more efficient, as oldPtr and newPtr can often be in the
same register (e.g. AX on amd64) and thus the phi takes no instructions.
Makes the go binary 0.3% smaller.
Change-Id: I7295a60227dbbeecec2bf039eeef2950a72df760
Reviewed-on: https://go-review.googlesource.com/c/go/+/418554
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2022-07-13 20:22:53 -07:00
|
|
|
// then { s = s[:n] }
|
|
|
|
slice := ir.NewSliceExpr(base.Pos, ir.OSLICE, s, nil, newLen, nil)
|
|
|
|
slice.SetBounded(true)
|
|
|
|
nif.Body = []ir.Node{
|
|
|
|
ir.NewAssignStmt(base.Pos, s, slice),
|
|
|
|
}
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
|
cmd/compile,runtime: redo growslice calling convention
Instead of passing the original length and the new length, pass
the new length and the length increment. Also use the new length
in all the post-growslice calculations so that the original length
is dead and does not need to be spilled/restored around the growslice.
old: growslice(typ, oldPtr, oldLen, oldCap, newLen) (newPtr, newLen, newCap)
new: growslice(oldPtr, newLen, oldCap, inc, typ) (newPtr, newLen, newCap)
where inc = # of elements added = newLen-oldLen
Also move the element type to the end of the call. This makes register
allocation more efficient, as oldPtr and newPtr can often be in the
same register (e.g. AX on amd64) and thus the phi takes no instructions.
Makes the go binary 0.3% smaller.
Change-Id: I7295a60227dbbeecec2bf039eeef2950a72df760
Reviewed-on: https://go-review.googlesource.com/c/go/+/418554
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2022-07-13 20:22:53 -07:00
|
|
|
fn := typecheck.LookupRuntime("growslice") // growslice(ptr *T, newLen, oldCap, num int, <type>) (ret []T)
|
|
|
|
fn = typecheck.SubstArgTypes(fn, s.Type().Elem(), s.Type().Elem())
|
|
|
|
|
|
|
|
// else { s = growslice(s.ptr, n, s.cap, a, T) }
|
|
|
|
nif.Else = []ir.Node{
|
|
|
|
ir.NewAssignStmt(base.Pos, s, mkcall1(fn, s.Type(), nif.PtrInit(),
|
|
|
|
ir.NewUnaryExpr(base.Pos, ir.OSPTR, s),
|
|
|
|
newLen,
|
|
|
|
ir.NewUnaryExpr(base.Pos, ir.OCAP, s),
|
|
|
|
num,
|
|
|
|
reflectdata.TypePtr(s.Type().Elem()))),
|
|
|
|
}
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
|
cmd/compile,runtime: redo growslice calling convention
Instead of passing the original length and the new length, pass
the new length and the length increment. Also use the new length
in all the post-growslice calculations so that the original length
is dead and does not need to be spilled/restored around the growslice.
old: growslice(typ, oldPtr, oldLen, oldCap, newLen) (newPtr, newLen, newCap)
new: growslice(oldPtr, newLen, oldCap, inc, typ) (newPtr, newLen, newCap)
where inc = # of elements added = newLen-oldLen
Also move the element type to the end of the call. This makes register
allocation more efficient, as oldPtr and newPtr can often be in the
same register (e.g. AX on amd64) and thus the phi takes no instructions.
Makes the go binary 0.3% smaller.
Change-Id: I7295a60227dbbeecec2bf039eeef2950a72df760
Reviewed-on: https://go-review.googlesource.com/c/go/+/418554
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2022-07-13 20:22:53 -07:00
|
|
|
l = append(l, nif)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
|
|
|
|
ls = n.Args[1:]
|
|
|
|
for i, n := range ls {
|
cmd/compile,runtime: redo growslice calling convention
Instead of passing the original length and the new length, pass
the new length and the length increment. Also use the new length
in all the post-growslice calculations so that the original length
is dead and does not need to be spilled/restored around the growslice.
old: growslice(typ, oldPtr, oldLen, oldCap, newLen) (newPtr, newLen, newCap)
new: growslice(oldPtr, newLen, oldCap, inc, typ) (newPtr, newLen, newCap)
where inc = # of elements added = newLen-oldLen
Also move the element type to the end of the call. This makes register
allocation more efficient, as oldPtr and newPtr can often be in the
same register (e.g. AX on amd64) and thus the phi takes no instructions.
Makes the go binary 0.3% smaller.
Change-Id: I7295a60227dbbeecec2bf039eeef2950a72df760
Reviewed-on: https://go-review.googlesource.com/c/go/+/418554
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2022-07-13 20:22:53 -07:00
|
|
|
// s[s.len-argc+i] = arg
|
2023-02-28 13:27:51 -08:00
|
|
|
ix := ir.NewIndexExpr(base.Pos, s, ir.NewBinaryExpr(base.Pos, ir.OSUB, newLen, ir.NewInt(base.Pos, int64(argc-i))))
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
ix.SetBounded(true)
|
cmd/compile,runtime: redo growslice calling convention
Instead of passing the original length and the new length, pass
the new length and the length increment. Also use the new length
in all the post-growslice calculations so that the original length
is dead and does not need to be spilled/restored around the growslice.
old: growslice(typ, oldPtr, oldLen, oldCap, newLen) (newPtr, newLen, newCap)
new: growslice(oldPtr, newLen, oldCap, inc, typ) (newPtr, newLen, newCap)
where inc = # of elements added = newLen-oldLen
Also move the element type to the end of the call. This makes register
allocation more efficient, as oldPtr and newPtr can often be in the
same register (e.g. AX on amd64) and thus the phi takes no instructions.
Makes the go binary 0.3% smaller.
Change-Id: I7295a60227dbbeecec2bf039eeef2950a72df760
Reviewed-on: https://go-review.googlesource.com/c/go/+/418554
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2022-07-13 20:22:53 -07:00
|
|
|
l = append(l, ir.NewAssignStmt(base.Pos, ix, n))
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
typecheck.Stmts(l)
|
|
|
|
walkStmtList(l)
|
|
|
|
init.Append(l...)
|
cmd/compile,runtime: redo growslice calling convention
Instead of passing the original length and the new length, pass
the new length and the length increment. Also use the new length
in all the post-growslice calculations so that the original length
is dead and does not need to be spilled/restored around the growslice.
old: growslice(typ, oldPtr, oldLen, oldCap, newLen) (newPtr, newLen, newCap)
new: growslice(oldPtr, newLen, oldCap, inc, typ) (newPtr, newLen, newCap)
where inc = # of elements added = newLen-oldLen
Also move the element type to the end of the call. This makes register
allocation more efficient, as oldPtr and newPtr can often be in the
same register (e.g. AX on amd64) and thus the phi takes no instructions.
Makes the go binary 0.3% smaller.
Change-Id: I7295a60227dbbeecec2bf039eeef2950a72df760
Reviewed-on: https://go-review.googlesource.com/c/go/+/418554
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2022-07-13 20:22:53 -07:00
|
|
|
return s
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
2022-11-25 16:11:45 +07:00
|
|
|
// walkClear walks an OCLEAR node.
|
|
|
|
func walkClear(n *ir.UnaryExpr) ir.Node {
|
|
|
|
typ := n.X.Type()
|
|
|
|
switch {
|
|
|
|
case typ.IsSlice():
|
|
|
|
return arrayClear(n.X.Pos(), n.X, nil)
|
|
|
|
case typ.IsMap():
|
|
|
|
return mapClear(n.X, reflectdata.TypePtrAt(n.X.Pos(), n.X.Type()))
|
|
|
|
}
|
|
|
|
panic("unreachable")
|
|
|
|
}
|
|
|
|
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
// walkClose walks an OCLOSE node.
|
|
|
|
func walkClose(n *ir.UnaryExpr, init *ir.Nodes) ir.Node {
|
|
|
|
// cannot use chanfn - closechan takes any, not chan any
|
|
|
|
fn := typecheck.LookupRuntime("closechan")
|
|
|
|
fn = typecheck.SubstArgTypes(fn, n.X.Type())
|
|
|
|
return mkcall1(fn, nil, init, n.X)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Lower copy(a, b) to a memmove call or a runtime call.
|
|
|
|
//
|
2022-01-29 19:07:27 -05:00
|
|
|
// init {
|
|
|
|
// n := len(a)
|
|
|
|
// if n > len(b) { n = len(b) }
|
|
|
|
// if a.ptr != b.ptr { memmove(a.ptr, b.ptr, n*sizeof(elem(a))) }
|
|
|
|
// }
|
|
|
|
// n;
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
//
|
|
|
|
// Also works if b is a string.
|
|
|
|
func walkCopy(n *ir.BinaryExpr, init *ir.Nodes, runtimecall bool) ir.Node {
|
|
|
|
if n.X.Type().Elem().HasPointers() {
|
|
|
|
ir.CurFunc.SetWBPos(n.Pos())
|
|
|
|
fn := writebarrierfn("typedslicecopy", n.X.Type().Elem(), n.Y.Type().Elem())
|
|
|
|
n.X = cheapExpr(n.X, init)
|
|
|
|
ptrL, lenL := backingArrayPtrLen(n.X)
|
|
|
|
n.Y = cheapExpr(n.Y, init)
|
|
|
|
ptrR, lenR := backingArrayPtrLen(n.Y)
|
2022-06-14 16:07:46 -07:00
|
|
|
return mkcall1(fn, n.Type(), init, reflectdata.CopyElemRType(base.Pos, n), ptrL, lenL, ptrR, lenR)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
if runtimecall {
|
|
|
|
// rely on runtime to instrument:
|
|
|
|
// copy(n.Left, n.Right)
|
|
|
|
// n.Right can be a slice or string.
|
|
|
|
|
|
|
|
n.X = cheapExpr(n.X, init)
|
|
|
|
ptrL, lenL := backingArrayPtrLen(n.X)
|
|
|
|
n.Y = cheapExpr(n.Y, init)
|
|
|
|
ptrR, lenR := backingArrayPtrLen(n.Y)
|
|
|
|
|
|
|
|
fn := typecheck.LookupRuntime("slicecopy")
|
|
|
|
fn = typecheck.SubstArgTypes(fn, ptrL.Type().Elem(), ptrR.Type().Elem())
|
|
|
|
|
2023-02-28 13:27:51 -08:00
|
|
|
return mkcall1(fn, n.Type(), init, ptrL, lenL, ptrR, lenR, ir.NewInt(base.Pos, n.X.Type().Elem().Size()))
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
n.X = walkExpr(n.X, init)
|
|
|
|
n.Y = walkExpr(n.Y, init)
|
|
|
|
nl := typecheck.Temp(n.X.Type())
|
|
|
|
nr := typecheck.Temp(n.Y.Type())
|
|
|
|
var l []ir.Node
|
|
|
|
l = append(l, ir.NewAssignStmt(base.Pos, nl, n.X))
|
|
|
|
l = append(l, ir.NewAssignStmt(base.Pos, nr, n.Y))
|
|
|
|
|
|
|
|
nfrm := ir.NewUnaryExpr(base.Pos, ir.OSPTR, nr)
|
|
|
|
nto := ir.NewUnaryExpr(base.Pos, ir.OSPTR, nl)
|
|
|
|
|
|
|
|
nlen := typecheck.Temp(types.Types[types.TINT])
|
|
|
|
|
|
|
|
// n = len(to)
|
|
|
|
l = append(l, ir.NewAssignStmt(base.Pos, nlen, ir.NewUnaryExpr(base.Pos, ir.OLEN, nl)))
|
|
|
|
|
|
|
|
// if n > len(frm) { n = len(frm) }
|
|
|
|
nif := ir.NewIfStmt(base.Pos, nil, nil, nil)
|
|
|
|
|
|
|
|
nif.Cond = ir.NewBinaryExpr(base.Pos, ir.OGT, nlen, ir.NewUnaryExpr(base.Pos, ir.OLEN, nr))
|
|
|
|
nif.Body.Append(ir.NewAssignStmt(base.Pos, nlen, ir.NewUnaryExpr(base.Pos, ir.OLEN, nr)))
|
|
|
|
l = append(l, nif)
|
|
|
|
|
|
|
|
// if to.ptr != frm.ptr { memmove( ... ) }
|
|
|
|
ne := ir.NewIfStmt(base.Pos, ir.NewBinaryExpr(base.Pos, ir.ONE, nto, nfrm), nil, nil)
|
|
|
|
ne.Likely = true
|
|
|
|
l = append(l, ne)
|
|
|
|
|
|
|
|
fn := typecheck.LookupRuntime("memmove")
|
|
|
|
fn = typecheck.SubstArgTypes(fn, nl.Type().Elem(), nl.Type().Elem())
|
|
|
|
nwid := ir.Node(typecheck.Temp(types.Types[types.TUINTPTR]))
|
|
|
|
setwid := ir.NewAssignStmt(base.Pos, nwid, typecheck.Conv(nlen, types.Types[types.TUINTPTR]))
|
|
|
|
ne.Body.Append(setwid)
|
2023-02-28 13:27:51 -08:00
|
|
|
nwid = ir.NewBinaryExpr(base.Pos, ir.OMUL, nwid, ir.NewInt(base.Pos, nl.Type().Elem().Size()))
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
call := mkcall1(fn, nil, init, nto, nfrm, nwid)
|
|
|
|
ne.Body.Append(call)
|
|
|
|
|
|
|
|
typecheck.Stmts(l)
|
|
|
|
walkStmtList(l)
|
|
|
|
init.Append(l...)
|
|
|
|
return nlen
|
|
|
|
}
|
|
|
|
|
|
|
|
// walkDelete walks an ODELETE node.
|
|
|
|
func walkDelete(init *ir.Nodes, n *ir.CallExpr) ir.Node {
|
2021-01-02 01:04:19 -08:00
|
|
|
init.Append(ir.TakeInit(n)...)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
map_ := n.Args[0]
|
|
|
|
key := n.Args[1]
|
|
|
|
map_ = walkExpr(map_, init)
|
|
|
|
key = walkExpr(key, init)
|
|
|
|
|
|
|
|
t := map_.Type()
|
|
|
|
fast := mapfast(t)
|
2021-05-24 12:15:17 +07:00
|
|
|
key = mapKeyArg(fast, n, key, false)
|
2022-06-14 16:07:46 -07:00
|
|
|
return mkcall1(mapfndel(mapdelete[fast], t), nil, init, reflectdata.DeleteMapRType(base.Pos, n), map_, key)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// walkLenCap walks an OLEN or OCAP node.
|
|
|
|
func walkLenCap(n *ir.UnaryExpr, init *ir.Nodes) ir.Node {
|
|
|
|
if isRuneCount(n) {
|
|
|
|
// Replace len([]rune(string)) with runtime.countrunes(string).
|
|
|
|
return mkcall("countrunes", n.Type(), init, typecheck.Conv(n.X.(*ir.ConvExpr).X, types.Types[types.TSTRING]))
|
|
|
|
}
|
2023-05-23 11:23:48 +07:00
|
|
|
if isByteCount(n) {
|
|
|
|
_, len := backingArrayPtrLen(cheapExpr(n.X.(*ir.ConvExpr).X, init))
|
|
|
|
return len
|
|
|
|
}
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
|
|
|
|
n.X = walkExpr(n.X, init)
|
|
|
|
|
|
|
|
// replace len(*[10]int) with 10.
|
|
|
|
// delayed until now to preserve side effects.
|
|
|
|
t := n.X.Type()
|
|
|
|
|
|
|
|
if t.IsPtr() {
|
|
|
|
t = t.Elem()
|
|
|
|
}
|
|
|
|
if t.IsArray() {
|
|
|
|
safeExpr(n.X, init)
|
|
|
|
con := typecheck.OrigInt(n, t.NumElem())
|
|
|
|
con.SetTypecheck(1)
|
|
|
|
return con
|
|
|
|
}
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
|
|
|
// walkMakeChan walks an OMAKECHAN node.
|
|
|
|
func walkMakeChan(n *ir.MakeExpr, init *ir.Nodes) ir.Node {
|
|
|
|
// When size fits into int, use makechan instead of
|
|
|
|
// makechan64, which is faster and shorter on 32 bit platforms.
|
|
|
|
size := n.Len
|
|
|
|
fnname := "makechan64"
|
|
|
|
argtype := types.Types[types.TINT64]
|
|
|
|
|
|
|
|
// Type checking guarantees that TIDEAL size is positive and fits in an int.
|
|
|
|
// The case of size overflow when converting TUINT or TUINTPTR to TINT
|
|
|
|
// will be handled by the negative range checks in makechan during runtime.
|
|
|
|
if size.Type().IsKind(types.TIDEAL) || size.Type().Size() <= types.Types[types.TUINT].Size() {
|
|
|
|
fnname = "makechan"
|
|
|
|
argtype = types.Types[types.TINT]
|
|
|
|
}
|
|
|
|
|
2022-06-14 16:07:46 -07:00
|
|
|
return mkcall1(chanfn(fnname, 1, n.Type()), n.Type(), init, reflectdata.MakeChanRType(base.Pos, n), typecheck.Conv(size, argtype))
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// walkMakeMap walks an OMAKEMAP node.
|
|
|
|
func walkMakeMap(n *ir.MakeExpr, init *ir.Nodes) ir.Node {
|
|
|
|
t := n.Type()
|
|
|
|
hmapType := reflectdata.MapType(t)
|
|
|
|
hint := n.Len
|
|
|
|
|
|
|
|
// var h *hmap
|
|
|
|
var h ir.Node
|
|
|
|
if n.Esc() == ir.EscNone {
|
|
|
|
// Allocate hmap on stack.
|
|
|
|
|
|
|
|
// var hv hmap
|
|
|
|
// h = &hv
|
2021-01-16 18:25:00 -08:00
|
|
|
h = stackTempAddr(init, hmapType)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
|
|
|
|
// Allocate one bucket pointed to by hmap.buckets on stack if hint
|
|
|
|
// is not larger than BUCKETSIZE. In case hint is larger than
|
|
|
|
// BUCKETSIZE runtime.makemap will allocate the buckets on the heap.
|
|
|
|
// Maximum key and elem size is 128 bytes, larger objects
|
|
|
|
// are stored with an indirection. So max bucket size is 2048+eps.
|
|
|
|
if !ir.IsConst(hint, constant.Int) ||
|
|
|
|
constant.Compare(hint.Val(), token.LEQ, constant.MakeInt64(reflectdata.BUCKETSIZE)) {
|
|
|
|
|
|
|
|
// In case hint is larger than BUCKETSIZE runtime.makemap
|
|
|
|
// will allocate the buckets on the heap, see #20184
|
|
|
|
//
|
|
|
|
// if hint <= BUCKETSIZE {
|
|
|
|
// var bv bmap
|
|
|
|
// b = &bv
|
|
|
|
// h.buckets = b
|
|
|
|
// }
|
|
|
|
|
2023-02-28 13:27:51 -08:00
|
|
|
nif := ir.NewIfStmt(base.Pos, ir.NewBinaryExpr(base.Pos, ir.OLE, hint, ir.NewInt(base.Pos, reflectdata.BUCKETSIZE)), nil, nil)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
nif.Likely = true
|
|
|
|
|
|
|
|
// var bv bmap
|
|
|
|
// b = &bv
|
2021-01-16 18:25:00 -08:00
|
|
|
b := stackTempAddr(&nif.Body, reflectdata.MapBucketType(t))
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
|
|
|
|
// h.buckets = b
|
|
|
|
bsym := hmapType.Field(5).Sym // hmap.buckets see reflect.go:hmap
|
|
|
|
na := ir.NewAssignStmt(base.Pos, ir.NewSelectorExpr(base.Pos, ir.ODOT, h, bsym), b)
|
|
|
|
nif.Body.Append(na)
|
|
|
|
appendWalkStmt(init, nif)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ir.IsConst(hint, constant.Int) && constant.Compare(hint.Val(), token.LEQ, constant.MakeInt64(reflectdata.BUCKETSIZE)) {
|
|
|
|
// Handling make(map[any]any) and
|
|
|
|
// make(map[any]any, hint) where hint <= BUCKETSIZE
|
|
|
|
// special allows for faster map initialization and
|
|
|
|
// improves binary size by using calls with fewer arguments.
|
|
|
|
// For hint <= BUCKETSIZE overLoadFactor(hint, 0) is false
|
|
|
|
// and no buckets will be allocated by makemap. Therefore,
|
|
|
|
// no buckets need to be allocated in this code path.
|
|
|
|
if n.Esc() == ir.EscNone {
|
|
|
|
// Only need to initialize h.hash0 since
|
|
|
|
// hmap h has been allocated on the stack already.
|
|
|
|
// h.hash0 = fastrand()
|
|
|
|
rand := mkcall("fastrand", types.Types[types.TUINT32], init)
|
|
|
|
hashsym := hmapType.Field(4).Sym // hmap.hash0 see reflect.go:hmap
|
|
|
|
appendWalkStmt(init, ir.NewAssignStmt(base.Pos, ir.NewSelectorExpr(base.Pos, ir.ODOT, h, hashsym), rand))
|
|
|
|
return typecheck.ConvNop(h, t)
|
|
|
|
}
|
|
|
|
// Call runtime.makehmap to allocate an
|
|
|
|
// hmap on the heap and initialize hmap's hash0 field.
|
|
|
|
fn := typecheck.LookupRuntime("makemap_small")
|
|
|
|
fn = typecheck.SubstArgTypes(fn, t.Key(), t.Elem())
|
|
|
|
return mkcall1(fn, n.Type(), init)
|
|
|
|
}
|
|
|
|
|
|
|
|
if n.Esc() != ir.EscNone {
|
|
|
|
h = typecheck.NodNil()
|
|
|
|
}
|
|
|
|
// Map initialization with a variable or large hint is
|
|
|
|
// more complicated. We therefore generate a call to
|
|
|
|
// runtime.makemap to initialize hmap and allocate the
|
|
|
|
// map buckets.
|
|
|
|
|
|
|
|
// When hint fits into int, use makemap instead of
|
|
|
|
// makemap64, which is faster and shorter on 32 bit platforms.
|
|
|
|
fnname := "makemap64"
|
|
|
|
argtype := types.Types[types.TINT64]
|
|
|
|
|
|
|
|
// Type checking guarantees that TIDEAL hint is positive and fits in an int.
|
|
|
|
// See checkmake call in TMAP case of OMAKE case in OpSwitch in typecheck1 function.
|
|
|
|
// The case of hint overflow when converting TUINT or TUINTPTR to TINT
|
|
|
|
// will be handled by the negative range checks in makemap during runtime.
|
|
|
|
if hint.Type().IsKind(types.TIDEAL) || hint.Type().Size() <= types.Types[types.TUINT].Size() {
|
|
|
|
fnname = "makemap"
|
|
|
|
argtype = types.Types[types.TINT]
|
|
|
|
}
|
|
|
|
|
|
|
|
fn := typecheck.LookupRuntime(fnname)
|
|
|
|
fn = typecheck.SubstArgTypes(fn, hmapType, t.Key(), t.Elem())
|
2022-06-14 16:07:46 -07:00
|
|
|
return mkcall1(fn, n.Type(), init, reflectdata.MakeMapRType(base.Pos, n), typecheck.Conv(hint, argtype), h)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// walkMakeSlice walks an OMAKESLICE node.
|
|
|
|
func walkMakeSlice(n *ir.MakeExpr, init *ir.Nodes) ir.Node {
|
|
|
|
l := n.Len
|
|
|
|
r := n.Cap
|
|
|
|
if r == nil {
|
|
|
|
r = safeExpr(l, init)
|
|
|
|
l = r
|
|
|
|
}
|
|
|
|
t := n.Type()
|
|
|
|
if t.Elem().NotInHeap() {
|
|
|
|
base.Errorf("%v can't be allocated in Go; it is incomplete (or unallocatable)", t.Elem())
|
|
|
|
}
|
|
|
|
if n.Esc() == ir.EscNone {
|
|
|
|
if why := escape.HeapAllocReason(n); why != "" {
|
|
|
|
base.Fatalf("%v has EscNone, but %v", n, why)
|
|
|
|
}
|
|
|
|
// var arr [r]T
|
|
|
|
// n = arr[:l]
|
|
|
|
i := typecheck.IndexConst(r)
|
|
|
|
if i < 0 {
|
2021-01-15 14:12:35 -08:00
|
|
|
base.Fatalf("walkExpr: invalid index %v", r)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// cap is constrained to [0,2^31) or [0,2^63) depending on whether
|
|
|
|
// we're in 32-bit or 64-bit systems. So it's safe to do:
|
|
|
|
//
|
|
|
|
// if uint64(len) > cap {
|
|
|
|
// if len < 0 { panicmakeslicelen() }
|
|
|
|
// panicmakeslicecap()
|
|
|
|
// }
|
2023-02-28 13:27:51 -08:00
|
|
|
nif := ir.NewIfStmt(base.Pos, ir.NewBinaryExpr(base.Pos, ir.OGT, typecheck.Conv(l, types.Types[types.TUINT64]), ir.NewInt(base.Pos, i)), nil, nil)
|
|
|
|
niflen := ir.NewIfStmt(base.Pos, ir.NewBinaryExpr(base.Pos, ir.OLT, l, ir.NewInt(base.Pos, 0)), nil, nil)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
niflen.Body = []ir.Node{mkcall("panicmakeslicelen", nil, init)}
|
|
|
|
nif.Body.Append(niflen, mkcall("panicmakeslicecap", nil, init))
|
|
|
|
init.Append(typecheck.Stmt(nif))
|
|
|
|
|
|
|
|
t = types.NewArray(t.Elem(), i) // [r]T
|
|
|
|
var_ := typecheck.Temp(t)
|
2020-12-23 06:06:31 -08:00
|
|
|
appendWalkStmt(init, ir.NewAssignStmt(base.Pos, var_, nil)) // zero temp
|
|
|
|
r := ir.NewSliceExpr(base.Pos, ir.OSLICE, var_, nil, l, nil) // arr[:l]
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
// The conv is necessary in case n.Type is named.
|
|
|
|
return walkExpr(typecheck.Expr(typecheck.Conv(r, n.Type())), init)
|
|
|
|
}
|
|
|
|
|
|
|
|
// n escapes; set up a call to makeslice.
|
|
|
|
// When len and cap can fit into int, use makeslice instead of
|
|
|
|
// makeslice64, which is faster and shorter on 32 bit platforms.
|
|
|
|
|
|
|
|
len, cap := l, r
|
|
|
|
|
|
|
|
fnname := "makeslice64"
|
|
|
|
argtype := types.Types[types.TINT64]
|
|
|
|
|
|
|
|
// Type checking guarantees that TIDEAL len/cap are positive and fit in an int.
|
|
|
|
// The case of len or cap overflow when converting TUINT or TUINTPTR to TINT
|
|
|
|
// will be handled by the negative range checks in makeslice during runtime.
|
|
|
|
if (len.Type().IsKind(types.TIDEAL) || len.Type().Size() <= types.Types[types.TUINT].Size()) &&
|
|
|
|
(cap.Type().IsKind(types.TIDEAL) || cap.Type().Size() <= types.Types[types.TUINT].Size()) {
|
|
|
|
fnname = "makeslice"
|
|
|
|
argtype = types.Types[types.TINT]
|
|
|
|
}
|
|
|
|
fn := typecheck.LookupRuntime(fnname)
|
2022-06-14 16:07:46 -07:00
|
|
|
ptr := mkcall1(fn, types.Types[types.TUNSAFEPTR], init, reflectdata.MakeSliceElemRType(base.Pos, n), typecheck.Conv(len, argtype), typecheck.Conv(cap, argtype))
|
2021-04-29 14:28:43 +00:00
|
|
|
ptr.MarkNonNil()
|
|
|
|
len = typecheck.Conv(len, types.Types[types.TINT])
|
|
|
|
cap = typecheck.Conv(cap, types.Types[types.TINT])
|
|
|
|
sh := ir.NewSliceHeaderExpr(base.Pos, t, ptr, len, cap)
|
|
|
|
return walkExpr(typecheck.Expr(sh), init)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
|
|
|
|
func walkMakeSliceCopy(n *ir.MakeExpr, init *ir.Nodes) ir.Node {
|
|
|
|
if n.Esc() == ir.EscNone {
|
|
|
|
base.Fatalf("OMAKESLICECOPY with EscNone: %v", n)
|
|
|
|
}
|
|
|
|
|
|
|
|
t := n.Type()
|
|
|
|
if t.Elem().NotInHeap() {
|
|
|
|
base.Errorf("%v can't be allocated in Go; it is incomplete (or unallocatable)", t.Elem())
|
|
|
|
}
|
|
|
|
|
|
|
|
length := typecheck.Conv(n.Len, types.Types[types.TINT])
|
|
|
|
copylen := ir.NewUnaryExpr(base.Pos, ir.OLEN, n.Cap)
|
|
|
|
copyptr := ir.NewUnaryExpr(base.Pos, ir.OSPTR, n.Cap)
|
|
|
|
|
|
|
|
if !t.Elem().HasPointers() && n.Bounded() {
|
|
|
|
// When len(to)==len(from) and elements have no pointers:
|
|
|
|
// replace make+copy with runtime.mallocgc+runtime.memmove.
|
|
|
|
|
|
|
|
// We do not check for overflow of len(to)*elem.Width here
|
|
|
|
// since len(from) is an existing checked slice capacity
|
|
|
|
// with same elem.Width for the from slice.
|
2023-02-28 13:27:51 -08:00
|
|
|
size := ir.NewBinaryExpr(base.Pos, ir.OMUL, typecheck.Conv(length, types.Types[types.TUINTPTR]), typecheck.Conv(ir.NewInt(base.Pos, t.Elem().Size()), types.Types[types.TUINTPTR]))
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
|
|
|
|
// instantiate mallocgc(size uintptr, typ *byte, needszero bool) unsafe.Pointer
|
|
|
|
fn := typecheck.LookupRuntime("mallocgc")
|
2023-02-28 13:27:51 -08:00
|
|
|
ptr := mkcall1(fn, types.Types[types.TUNSAFEPTR], init, size, typecheck.NodNil(), ir.NewBool(base.Pos, false))
|
2021-04-29 14:28:43 +00:00
|
|
|
ptr.MarkNonNil()
|
|
|
|
sh := ir.NewSliceHeaderExpr(base.Pos, t, ptr, length, length)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
|
|
|
|
s := typecheck.Temp(t)
|
|
|
|
r := typecheck.Stmt(ir.NewAssignStmt(base.Pos, s, sh))
|
|
|
|
r = walkExpr(r, init)
|
|
|
|
init.Append(r)
|
|
|
|
|
|
|
|
// instantiate memmove(to *any, frm *any, size uintptr)
|
|
|
|
fn = typecheck.LookupRuntime("memmove")
|
|
|
|
fn = typecheck.SubstArgTypes(fn, t.Elem(), t.Elem())
|
|
|
|
ncopy := mkcall1(fn, nil, init, ir.NewUnaryExpr(base.Pos, ir.OSPTR, s), copyptr, size)
|
|
|
|
init.Append(walkExpr(typecheck.Stmt(ncopy), init))
|
|
|
|
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
// Replace make+copy with runtime.makeslicecopy.
|
|
|
|
// instantiate makeslicecopy(typ *byte, tolen int, fromlen int, from unsafe.Pointer) unsafe.Pointer
|
|
|
|
fn := typecheck.LookupRuntime("makeslicecopy")
|
2022-06-14 16:07:46 -07:00
|
|
|
ptr := mkcall1(fn, types.Types[types.TUNSAFEPTR], init, reflectdata.MakeSliceElemRType(base.Pos, n), length, copylen, typecheck.Conv(copyptr, types.Types[types.TUNSAFEPTR]))
|
2021-04-29 14:28:43 +00:00
|
|
|
ptr.MarkNonNil()
|
|
|
|
sh := ir.NewSliceHeaderExpr(base.Pos, t, ptr, length, length)
|
|
|
|
return walkExpr(typecheck.Expr(sh), init)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// walkNew walks an ONEW node.
|
|
|
|
func walkNew(n *ir.UnaryExpr, init *ir.Nodes) ir.Node {
|
2021-01-15 23:20:13 +07:00
|
|
|
t := n.Type().Elem()
|
|
|
|
if t.NotInHeap() {
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
base.Errorf("%v can't be allocated in Go; it is incomplete (or unallocatable)", n.Type().Elem())
|
|
|
|
}
|
|
|
|
if n.Esc() == ir.EscNone {
|
2021-07-01 14:25:45 +00:00
|
|
|
if t.Size() > ir.MaxImplicitStackVarSize {
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
base.Fatalf("large ONEW with EscNone: %v", n)
|
|
|
|
}
|
2021-01-16 18:25:00 -08:00
|
|
|
return stackTempAddr(init, t)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
2021-01-15 23:20:13 +07:00
|
|
|
types.CalcSize(t)
|
|
|
|
n.MarkNonNil()
|
|
|
|
return n
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
2023-05-18 17:16:03 -07:00
|
|
|
func walkMinMax(n *ir.CallExpr, init *ir.Nodes) ir.Node {
|
|
|
|
init.Append(ir.TakeInit(n)...)
|
|
|
|
walkExprList(n.Args, init)
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
2022-11-11 19:22:35 +08:00
|
|
|
// generate code for print.
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
func walkPrint(nn *ir.CallExpr, init *ir.Nodes) ir.Node {
|
|
|
|
// Hoist all the argument evaluation up before the lock.
|
|
|
|
walkExprListCheap(nn.Args, init)
|
|
|
|
|
|
|
|
// For println, add " " between elements and "\n" at the end.
|
|
|
|
if nn.Op() == ir.OPRINTN {
|
|
|
|
s := nn.Args
|
|
|
|
t := make([]ir.Node, 0, len(s)*2)
|
|
|
|
for i, n := range s {
|
|
|
|
if i != 0 {
|
2023-02-28 13:27:51 -08:00
|
|
|
t = append(t, ir.NewString(base.Pos, " "))
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
t = append(t, n)
|
|
|
|
}
|
2023-02-28 13:27:51 -08:00
|
|
|
t = append(t, ir.NewString(base.Pos, "\n"))
|
2021-01-02 01:27:29 -08:00
|
|
|
nn.Args = t
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// Collapse runs of constant strings.
|
|
|
|
s := nn.Args
|
|
|
|
t := make([]ir.Node, 0, len(s))
|
|
|
|
for i := 0; i < len(s); {
|
|
|
|
var strs []string
|
|
|
|
for i < len(s) && ir.IsConst(s[i], constant.String) {
|
|
|
|
strs = append(strs, ir.StringVal(s[i]))
|
|
|
|
i++
|
|
|
|
}
|
|
|
|
if len(strs) > 0 {
|
2023-02-28 13:27:51 -08:00
|
|
|
t = append(t, ir.NewString(base.Pos, strings.Join(strs, "")))
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
}
|
|
|
|
if i < len(s) {
|
|
|
|
t = append(t, s[i])
|
|
|
|
i++
|
|
|
|
}
|
|
|
|
}
|
2021-01-02 01:27:29 -08:00
|
|
|
nn.Args = t
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
|
|
|
|
calls := []ir.Node{mkcall("printlock", nil, init)}
|
|
|
|
for i, n := range nn.Args {
|
|
|
|
if n.Op() == ir.OLITERAL {
|
|
|
|
if n.Type() == types.UntypedRune {
|
|
|
|
n = typecheck.DefaultLit(n, types.RuneType)
|
|
|
|
}
|
|
|
|
|
|
|
|
switch n.Val().Kind() {
|
|
|
|
case constant.Int:
|
|
|
|
n = typecheck.DefaultLit(n, types.Types[types.TINT64])
|
|
|
|
|
|
|
|
case constant.Float:
|
|
|
|
n = typecheck.DefaultLit(n, types.Types[types.TFLOAT64])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if n.Op() != ir.OLITERAL && n.Type() != nil && n.Type().Kind() == types.TIDEAL {
|
|
|
|
n = typecheck.DefaultLit(n, types.Types[types.TINT64])
|
|
|
|
}
|
|
|
|
n = typecheck.DefaultLit(n, nil)
|
|
|
|
nn.Args[i] = n
|
|
|
|
if n.Type() == nil || n.Type().Kind() == types.TFORW {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
var on *ir.Name
|
|
|
|
switch n.Type().Kind() {
|
|
|
|
case types.TINTER:
|
|
|
|
if n.Type().IsEmptyInterface() {
|
|
|
|
on = typecheck.LookupRuntime("printeface")
|
|
|
|
} else {
|
|
|
|
on = typecheck.LookupRuntime("printiface")
|
|
|
|
}
|
|
|
|
on = typecheck.SubstArgTypes(on, n.Type()) // any-1
|
|
|
|
case types.TPTR:
|
|
|
|
if n.Type().Elem().NotInHeap() {
|
|
|
|
on = typecheck.LookupRuntime("printuintptr")
|
|
|
|
n = ir.NewConvExpr(base.Pos, ir.OCONV, nil, n)
|
|
|
|
n.SetType(types.Types[types.TUNSAFEPTR])
|
|
|
|
n = ir.NewConvExpr(base.Pos, ir.OCONV, nil, n)
|
|
|
|
n.SetType(types.Types[types.TUINTPTR])
|
|
|
|
break
|
|
|
|
}
|
|
|
|
fallthrough
|
|
|
|
case types.TCHAN, types.TMAP, types.TFUNC, types.TUNSAFEPTR:
|
|
|
|
on = typecheck.LookupRuntime("printpointer")
|
|
|
|
on = typecheck.SubstArgTypes(on, n.Type()) // any-1
|
|
|
|
case types.TSLICE:
|
|
|
|
on = typecheck.LookupRuntime("printslice")
|
|
|
|
on = typecheck.SubstArgTypes(on, n.Type()) // any-1
|
|
|
|
case types.TUINT, types.TUINT8, types.TUINT16, types.TUINT32, types.TUINT64, types.TUINTPTR:
|
|
|
|
if types.IsRuntimePkg(n.Type().Sym().Pkg) && n.Type().Sym().Name == "hex" {
|
|
|
|
on = typecheck.LookupRuntime("printhex")
|
|
|
|
} else {
|
|
|
|
on = typecheck.LookupRuntime("printuint")
|
|
|
|
}
|
|
|
|
case types.TINT, types.TINT8, types.TINT16, types.TINT32, types.TINT64:
|
|
|
|
on = typecheck.LookupRuntime("printint")
|
|
|
|
case types.TFLOAT32, types.TFLOAT64:
|
|
|
|
on = typecheck.LookupRuntime("printfloat")
|
|
|
|
case types.TCOMPLEX64, types.TCOMPLEX128:
|
|
|
|
on = typecheck.LookupRuntime("printcomplex")
|
|
|
|
case types.TBOOL:
|
|
|
|
on = typecheck.LookupRuntime("printbool")
|
|
|
|
case types.TSTRING:
|
|
|
|
cs := ""
|
|
|
|
if ir.IsConst(n, constant.String) {
|
|
|
|
cs = ir.StringVal(n)
|
|
|
|
}
|
|
|
|
switch cs {
|
|
|
|
case " ":
|
|
|
|
on = typecheck.LookupRuntime("printsp")
|
|
|
|
case "\n":
|
|
|
|
on = typecheck.LookupRuntime("printnl")
|
|
|
|
default:
|
|
|
|
on = typecheck.LookupRuntime("printstring")
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
badtype(ir.OPRINT, n.Type(), nil)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
r := ir.NewCallExpr(base.Pos, ir.OCALL, on, nil)
|
|
|
|
if params := on.Type().Params().FieldSlice(); len(params) > 0 {
|
|
|
|
t := params[0].Type
|
2021-10-06 13:16:02 -07:00
|
|
|
n = typecheck.Conv(n, t)
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
r.Args.Append(n)
|
|
|
|
}
|
|
|
|
calls = append(calls, r)
|
|
|
|
}
|
|
|
|
|
|
|
|
calls = append(calls, mkcall("printunlock", nil, init))
|
|
|
|
|
|
|
|
typecheck.Stmts(calls)
|
|
|
|
walkExprList(calls, init)
|
|
|
|
|
|
|
|
r := ir.NewBlockStmt(base.Pos, nil)
|
2021-01-02 01:27:29 -08:00
|
|
|
r.List = calls
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
return walkStmt(typecheck.Stmt(r))
|
|
|
|
}
|
|
|
|
|
2023-01-24 09:20:13 +08:00
|
|
|
// walkRecoverFP walks an ORECOVERFP node.
|
[dev.typeparams] cmd/compile: desugar ORECOVER into ORECOVERFP
Currently ORECOVER is a single operation that both (1) calculates
the (logical) caller frame pointer and (2) calls runtime.gorecover.
This is normally fine, but it's inconvenient for regabi, which wants
to wrap "defer recover()" into "defer func() { recover() }" and
needs (1) and (2) to happen at different times.
The current solution is to apply walkRecover early to split it into
the two steps, but calling it during order is a minor layering
violation. It works well today because the order and walk phases are
closely related anyway and walkRecover is relatively simple, but it
won't work for go/defer wrapping earlier into the frontend.
This CL adds a new, lower-level ORECOVERFP primitive, which represents
just part (2); and OGETCALLER{PC,SP} primitives, which provide a way
to compute (1) in the frontend too.
OGETCALLERPC isn't needed/used today, but it seems worth including for
completeness. Maybe it will be useful at some point for intrinsifying
runtime.getcaller{pc,sp}, like we already do for runtime.getg.
Change-Id: Iaa8ae51e09306c45c147b6759a5b7c24dcc317ca
Reviewed-on: https://go-review.googlesource.com/c/go/+/330192
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2021-06-22 13:44:18 -07:00
|
|
|
func walkRecoverFP(nn *ir.CallExpr, init *ir.Nodes) ir.Node {
|
|
|
|
return mkcall("gorecover", nn.Type(), init, walkExpr(nn.Args[0], init))
|
2021-03-25 13:24:16 -04:00
|
|
|
}
|
|
|
|
|
2022-08-16 17:52:13 +08:00
|
|
|
// walkUnsafeData walks an OUNSAFESLICEDATA or OUNSAFESTRINGDATA expression.
|
|
|
|
func walkUnsafeData(n *ir.UnaryExpr, init *ir.Nodes) ir.Node {
|
|
|
|
slice := walkExpr(n.X, init)
|
|
|
|
res := typecheck.Expr(ir.NewUnaryExpr(n.Pos(), ir.OSPTR, slice))
|
|
|
|
res.SetType(n.Type())
|
|
|
|
return walkExpr(res, init)
|
|
|
|
}
|
|
|
|
|
2021-04-21 02:11:15 -07:00
|
|
|
func walkUnsafeSlice(n *ir.BinaryExpr, init *ir.Nodes) ir.Node {
|
2021-06-25 11:07:28 -07:00
|
|
|
ptr := safeExpr(n.X, init)
|
2021-04-21 02:11:15 -07:00
|
|
|
len := safeExpr(n.Y, init)
|
2021-11-10 19:20:57 +07:00
|
|
|
sliceType := n.Type()
|
2021-04-21 02:11:15 -07:00
|
|
|
|
2021-06-25 11:07:28 -07:00
|
|
|
lenType := types.Types[types.TINT64]
|
2021-11-10 19:20:57 +07:00
|
|
|
unsafePtr := typecheck.Conv(ptr, types.Types[types.TUNSAFEPTR])
|
2021-04-21 02:11:15 -07:00
|
|
|
|
2021-11-10 19:20:57 +07:00
|
|
|
// If checkptr enabled, call runtime.unsafeslicecheckptr to check ptr and len.
|
|
|
|
// for simplicity, unsafeslicecheckptr always uses int64.
|
2021-04-21 02:11:15 -07:00
|
|
|
// Type checking guarantees that TIDEAL len/cap are positive and fit in an int.
|
|
|
|
// The case of len or cap overflow when converting TUINT or TUINTPTR to TINT
|
|
|
|
// will be handled by the negative range checks in unsafeslice during runtime.
|
2021-06-25 11:07:28 -07:00
|
|
|
if ir.ShouldCheckPtr(ir.CurFunc, 1) {
|
2021-11-10 19:20:57 +07:00
|
|
|
fnname := "unsafeslicecheckptr"
|
|
|
|
fn := typecheck.LookupRuntime(fnname)
|
2022-06-14 16:07:46 -07:00
|
|
|
init.Append(mkcall1(fn, nil, init, reflectdata.UnsafeSliceElemRType(base.Pos, n), unsafePtr, typecheck.Conv(len, lenType)))
|
2021-11-10 19:20:57 +07:00
|
|
|
} else {
|
|
|
|
// Otherwise, open code unsafe.Slice to prevent runtime call overhead.
|
|
|
|
// Keep this code in sync with runtime.unsafeslice{,64}
|
|
|
|
if len.Type().IsKind(types.TIDEAL) || len.Type().Size() <= types.Types[types.TUINT].Size() {
|
|
|
|
lenType = types.Types[types.TINT]
|
|
|
|
} else {
|
|
|
|
// len64 := int64(len)
|
|
|
|
// if int64(int(len64)) != len64 {
|
|
|
|
// panicunsafeslicelen()
|
|
|
|
// }
|
|
|
|
len64 := typecheck.Conv(len, lenType)
|
|
|
|
nif := ir.NewIfStmt(base.Pos, nil, nil, nil)
|
|
|
|
nif.Cond = ir.NewBinaryExpr(base.Pos, ir.ONE, typecheck.Conv(typecheck.Conv(len64, types.Types[types.TINT]), lenType), len64)
|
|
|
|
nif.Body.Append(mkcall("panicunsafeslicelen", nil, &nif.Body))
|
|
|
|
appendWalkStmt(init, nif)
|
|
|
|
}
|
2021-04-21 02:11:15 -07:00
|
|
|
|
2021-11-10 19:20:57 +07:00
|
|
|
// if len < 0 { panicunsafeslicelen() }
|
|
|
|
nif := ir.NewIfStmt(base.Pos, nil, nil, nil)
|
2023-02-28 13:27:51 -08:00
|
|
|
nif.Cond = ir.NewBinaryExpr(base.Pos, ir.OLT, typecheck.Conv(len, lenType), ir.NewInt(base.Pos, 0))
|
2021-11-10 19:20:57 +07:00
|
|
|
nif.Body.Append(mkcall("panicunsafeslicelen", nil, &nif.Body))
|
|
|
|
appendWalkStmt(init, nif)
|
|
|
|
|
2022-08-08 16:07:05 +00:00
|
|
|
if sliceType.Elem().Size() == 0 {
|
|
|
|
// if ptr == nil && len > 0 {
|
|
|
|
// panicunsafesliceptrnil()
|
|
|
|
// }
|
|
|
|
nifPtr := ir.NewIfStmt(base.Pos, nil, nil, nil)
|
|
|
|
isNil := ir.NewBinaryExpr(base.Pos, ir.OEQ, unsafePtr, typecheck.NodNil())
|
2023-02-28 13:27:51 -08:00
|
|
|
gtZero := ir.NewBinaryExpr(base.Pos, ir.OGT, typecheck.Conv(len, lenType), ir.NewInt(base.Pos, 0))
|
2022-08-08 16:07:05 +00:00
|
|
|
nifPtr.Cond =
|
|
|
|
ir.NewLogicalExpr(base.Pos, ir.OANDAND, isNil, gtZero)
|
|
|
|
nifPtr.Body.Append(mkcall("panicunsafeslicenilptr", nil, &nifPtr.Body))
|
|
|
|
appendWalkStmt(init, nifPtr)
|
|
|
|
|
|
|
|
h := ir.NewSliceHeaderExpr(n.Pos(), sliceType,
|
|
|
|
typecheck.Conv(ptr, types.Types[types.TUNSAFEPTR]),
|
|
|
|
typecheck.Conv(len, types.Types[types.TINT]),
|
|
|
|
typecheck.Conv(len, types.Types[types.TINT]))
|
|
|
|
return walkExpr(typecheck.Expr(h), init)
|
|
|
|
}
|
|
|
|
|
2021-11-10 19:20:57 +07:00
|
|
|
// mem, overflow := runtime.mulUintptr(et.size, len)
|
|
|
|
mem := typecheck.Temp(types.Types[types.TUINTPTR])
|
|
|
|
overflow := typecheck.Temp(types.Types[types.TBOOL])
|
|
|
|
fn := typecheck.LookupRuntime("mulUintptr")
|
2023-02-28 13:27:51 -08:00
|
|
|
call := mkcall1(fn, fn.Type().Results(), init, ir.NewInt(base.Pos, sliceType.Elem().Size()), typecheck.Conv(typecheck.Conv(len, lenType), types.Types[types.TUINTPTR]))
|
2021-11-10 19:20:57 +07:00
|
|
|
appendWalkStmt(init, ir.NewAssignListStmt(base.Pos, ir.OAS2, []ir.Node{mem, overflow}, []ir.Node{call}))
|
|
|
|
|
|
|
|
// if overflow || mem > -uintptr(ptr) {
|
|
|
|
// if ptr == nil {
|
|
|
|
// panicunsafesliceptrnil()
|
|
|
|
// }
|
|
|
|
// panicunsafeslicelen()
|
|
|
|
// }
|
|
|
|
nif = ir.NewIfStmt(base.Pos, nil, nil, nil)
|
|
|
|
memCond := ir.NewBinaryExpr(base.Pos, ir.OGT, mem, ir.NewUnaryExpr(base.Pos, ir.ONEG, typecheck.Conv(unsafePtr, types.Types[types.TUINTPTR])))
|
|
|
|
nif.Cond = ir.NewLogicalExpr(base.Pos, ir.OOROR, overflow, memCond)
|
|
|
|
nifPtr := ir.NewIfStmt(base.Pos, nil, nil, nil)
|
|
|
|
nifPtr.Cond = ir.NewBinaryExpr(base.Pos, ir.OEQ, unsafePtr, typecheck.NodNil())
|
|
|
|
nifPtr.Body.Append(mkcall("panicunsafeslicenilptr", nil, &nifPtr.Body))
|
|
|
|
nif.Body.Append(nifPtr, mkcall("panicunsafeslicelen", nil, &nif.Body))
|
|
|
|
appendWalkStmt(init, nif)
|
|
|
|
}
|
2021-04-21 02:11:15 -07:00
|
|
|
|
2021-11-10 19:20:57 +07:00
|
|
|
h := ir.NewSliceHeaderExpr(n.Pos(), sliceType,
|
2021-04-21 02:11:15 -07:00
|
|
|
typecheck.Conv(ptr, types.Types[types.TUNSAFEPTR]),
|
|
|
|
typecheck.Conv(len, types.Types[types.TINT]),
|
|
|
|
typecheck.Conv(len, types.Types[types.TINT]))
|
|
|
|
return walkExpr(typecheck.Expr(h), init)
|
|
|
|
}
|
|
|
|
|
2022-08-16 17:52:13 +08:00
|
|
|
func walkUnsafeString(n *ir.BinaryExpr, init *ir.Nodes) ir.Node {
|
|
|
|
ptr := safeExpr(n.X, init)
|
|
|
|
len := safeExpr(n.Y, init)
|
|
|
|
|
|
|
|
lenType := types.Types[types.TINT64]
|
|
|
|
unsafePtr := typecheck.Conv(ptr, types.Types[types.TUNSAFEPTR])
|
|
|
|
|
|
|
|
// If checkptr enabled, call runtime.unsafestringcheckptr to check ptr and len.
|
|
|
|
// for simplicity, unsafestringcheckptr always uses int64.
|
|
|
|
// Type checking guarantees that TIDEAL len are positive and fit in an int.
|
|
|
|
if ir.ShouldCheckPtr(ir.CurFunc, 1) {
|
|
|
|
fnname := "unsafestringcheckptr"
|
|
|
|
fn := typecheck.LookupRuntime(fnname)
|
|
|
|
init.Append(mkcall1(fn, nil, init, unsafePtr, typecheck.Conv(len, lenType)))
|
|
|
|
} else {
|
|
|
|
// Otherwise, open code unsafe.String to prevent runtime call overhead.
|
|
|
|
// Keep this code in sync with runtime.unsafestring{,64}
|
|
|
|
if len.Type().IsKind(types.TIDEAL) || len.Type().Size() <= types.Types[types.TUINT].Size() {
|
|
|
|
lenType = types.Types[types.TINT]
|
|
|
|
} else {
|
|
|
|
// len64 := int64(len)
|
|
|
|
// if int64(int(len64)) != len64 {
|
|
|
|
// panicunsafestringlen()
|
|
|
|
// }
|
|
|
|
len64 := typecheck.Conv(len, lenType)
|
|
|
|
nif := ir.NewIfStmt(base.Pos, nil, nil, nil)
|
|
|
|
nif.Cond = ir.NewBinaryExpr(base.Pos, ir.ONE, typecheck.Conv(typecheck.Conv(len64, types.Types[types.TINT]), lenType), len64)
|
|
|
|
nif.Body.Append(mkcall("panicunsafestringlen", nil, &nif.Body))
|
|
|
|
appendWalkStmt(init, nif)
|
|
|
|
}
|
|
|
|
|
|
|
|
// if len < 0 { panicunsafestringlen() }
|
|
|
|
nif := ir.NewIfStmt(base.Pos, nil, nil, nil)
|
2023-02-28 13:27:51 -08:00
|
|
|
nif.Cond = ir.NewBinaryExpr(base.Pos, ir.OLT, typecheck.Conv(len, lenType), ir.NewInt(base.Pos, 0))
|
2022-08-16 17:52:13 +08:00
|
|
|
nif.Body.Append(mkcall("panicunsafestringlen", nil, &nif.Body))
|
|
|
|
appendWalkStmt(init, nif)
|
|
|
|
|
|
|
|
// if uintpr(len) > -uintptr(ptr) {
|
|
|
|
// if ptr == nil {
|
|
|
|
// panicunsafestringnilptr()
|
|
|
|
// }
|
|
|
|
// panicunsafeslicelen()
|
|
|
|
// }
|
|
|
|
nifLen := ir.NewIfStmt(base.Pos, nil, nil, nil)
|
|
|
|
nifLen.Cond = ir.NewBinaryExpr(base.Pos, ir.OGT, typecheck.Conv(len, types.Types[types.TUINTPTR]), ir.NewUnaryExpr(base.Pos, ir.ONEG, typecheck.Conv(unsafePtr, types.Types[types.TUINTPTR])))
|
|
|
|
nifPtr := ir.NewIfStmt(base.Pos, nil, nil, nil)
|
|
|
|
nifPtr.Cond = ir.NewBinaryExpr(base.Pos, ir.OEQ, unsafePtr, typecheck.NodNil())
|
|
|
|
nifPtr.Body.Append(mkcall("panicunsafestringnilptr", nil, &nifPtr.Body))
|
|
|
|
nifLen.Body.Append(nifPtr, mkcall("panicunsafestringlen", nil, &nifLen.Body))
|
|
|
|
appendWalkStmt(init, nifLen)
|
|
|
|
}
|
|
|
|
h := ir.NewStringHeaderExpr(n.Pos(),
|
|
|
|
typecheck.Conv(ptr, types.Types[types.TUNSAFEPTR]),
|
|
|
|
typecheck.Conv(len, types.Types[types.TINT]),
|
|
|
|
)
|
|
|
|
return walkExpr(typecheck.Expr(h), init)
|
|
|
|
}
|
|
|
|
|
[dev.regabi] cmd/compile: split up walkexpr1, walkstmt [generated]
walkexpr1 is the second largest non-machine-generated function in the compiler.
weighing in at 1,164 lines. Since we are destroying the git blame history
anyway, now is a good time to split each different case into its own function,
making future work on this function more manageable.
Do the same to walkstmt too for consistency, even though it is a paltry 259 lines.
[git-generate]
cd src/cmd/compile/internal/walk
rf '
mv addstr walkAddString
mv walkCall walkCall1
mv walkpartialcall walkCallPart
mv walkclosure walkClosure
mv walkrange walkRange
mv walkselect walkSelect
mv walkselectcases walkSelectCases
mv walkswitch walkSwitch
mv walkExprSwitch walkSwitchExpr
mv walkTypeSwitch walkSwitchType
mv walkstmt walkStmt
mv walkstmtlist walkStmtList
mv walkexprlist walkExprList
mv walkexprlistsafe walkExprListSafe
mv walkexprlistcheap walkExprListCheap
mv walkexpr walkExpr
mv walkexpr1 walkExpr1
mv walkprint walkPrint
mv walkappend walkAppend
mv walkcompare walkCompare
mv walkcompareInterface walkCompareInterface
mv walkcompareString walkCompareString
mv appendslice appendSlice
mv cheapexpr cheapExpr
mv copyany walkCopy
mv copyexpr copyExpr
mv eqfor eqFor
mv extendslice extendSlice
mv finishcompare finishCompare
mv safeexpr safeExpr
mv walkStmt:/^\tcase ir.ORECV:/+2,/^\tcase /-2 walkRecv
add walk.go:/^func walkRecv/-0 \
// walkRecv walks an ORECV node.
mv walkStmt:/^\tcase ir.ODCL:/+2,/^\tcase /-2 walkDecl
add walk.go:/^func walkDecl/-0 \
// walkDecl walks an ODCL node.
mv walkStmt:/^\tcase ir.OGO:/+2,/^\tcase /-2 walkGoDefer
add walk.go:/^func walkGoDefer/-0 \
// walkGoDefer walks an OGO or ODEFER node.
mv walkStmt:/^\tcase ir.OFOR,/+2,/^\tcase /-2 walkFor
add walk.go:/^func walkFor/-0 \
// walkFor walks an OFOR or OFORUNTIL node.
mv walkStmt:/^\tcase ir.OIF:/+2,/^\tcase /-2 walkIf
add walk.go:/^func walkIf/-0 \
// walkIf walks an OIF node.
mv walkStmt:/^\tcase ir.ORETURN:/+2,/^\tcase /-2 walkReturn
add walk.go:/^func walkReturn/-0 \
// walkReturn walks an ORETURN node.
mv walkExpr1:/^\tcase ir.ODOT,/+2,/^\tcase /-2 walkDot
add walk.go:/^func walkDot/-0 \
// walkDot walks an ODOT or ODOTPTR node.
mv walkExpr1:/^\tcase ir.ODOTTYPE,/+2,/^\tcase /-2 walkDotType
add walk.go:/^func walkDotType/-0 \
// walkDotType walks an ODOTTYPE or ODOTTYPE2 node.
mv walkExpr1:/^\tcase ir.OLEN,/+2,/^\tcase /-2 walkLenCap
add walk.go:/^func walkLenCap/-0 \
// walkLenCap walks an OLEN or OCAP node.
mv walkExpr1:/^\tcase ir.OANDAND,/+2,/^\tcase /-2 walkLogical
add walk.go:/^func walkLogical/-0 \
// walkLogical walks an OANDAND or OOROR node.
mv walkExpr1:/^\tcase ir.OCALLINTER,/+2,/^\tcase /-2 walkCall
add walk.go:/^func walkCall/-0 \
// walkCall walks an OCALLFUNC, OCALLINTER, or OCALLMETH node.
mv walkExpr1:/^\tcase ir.OAS,/+1,/^\tcase /-2 walkAssign
add walk.go:/^func walkAssign/-0 \
// walkAssign walks an OAS (AssignExpr) or OASOP (AssignOpExpr) node.
mv walkExpr1:/^\tcase ir.OAS2:/+2,/^\tcase /-3 walkAssignList
add walk.go:/^func walkAssignList/-0 \
// walkAssignList walks an OAS2 node.
mv walkExpr1:/^\tcase ir.OAS2FUNC:/+2,/^\tcase /-4 walkAssignFunc
add walk.go:/^func walkAssignFunc/-0 \
// walkAssignFunc walks an OAS2FUNC node.
mv walkExpr1:/^\tcase ir.OAS2RECV:/+2,/^\tcase /-3 walkAssignRecv
add walk.go:/^func walkAssignRecv/-0 \
// walkAssignRecv walks an OAS2RECV node.
mv walkExpr1:/^\tcase ir.OAS2MAPR:/+2,/^\tcase /-2 walkAssignMapRead
add walk.go:/^func walkAssignMapRead/-0 \
// walkAssignMapRead walks an OAS2MAPR node.
mv walkExpr1:/^\tcase ir.ODELETE:/+2,/^\tcase /-2 walkDelete
add walk.go:/^func walkDelete/-0 \
// walkDelete walks an ODELETE node.
mv walkExpr1:/^\tcase ir.OAS2DOTTYPE:/+2,/^\tcase /-2 walkAssignDotType
add walk.go:/^func walkAssignDotType/-0 \
// walkAssignDotType walks an OAS2DOTTYPE node.
mv walkExpr1:/^\tcase ir.OCONVIFACE:/+2,/^\tcase /-2 walkConvInterface
add walk.go:/^func walkConvInterface/-0 \
// walkConvInterface walks an OCONVIFACE node.
mv walkExpr1:/^\tcase ir.OCONV,/+2,/^\tcase /-2 walkConv
add walk.go:/^func walkConv/-0 \
// walkConv walks an OCONV or OCONVNOP (but not OCONVIFACE) node.
mv walkExpr1:/^\tcase ir.ODIV,/+2,/^\tcase /-2 walkDivMod
add walk.go:/^func walkDivMod/-0 \
// walkDivMod walks an ODIV or OMOD node.
mv walkExpr1:/^\tcase ir.OINDEX:/+2,/^\tcase /-2 walkIndex
add walk.go:/^func walkIndex/-0 \
// walkIndex walks an OINDEX node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+/n := n/-+ walkExpr1:/^\tcase ir.OINDEXMAP:/+0
mv walkExpr1:/^\tcase ir.OINDEXMAP:/+2,/^\tcase /-2 walkIndexMap
add walk.go:/^func walkIndexMap/-0 \
// walkIndexMap walks an OINDEXMAP node.
mv walkExpr1:/^\tcase ir.OSLICEHEADER:/+2,/^\tcase /-2 walkSliceHeader
add walk.go:/^func walkSliceHeader/-0 \
// walkSliceHeader walks an OSLICEHEADER node.
mv walkExpr1:/^\tcase ir.OSLICE,/+2,/^\tcase /-2 walkSlice
add walk.go:/^func walkSlice/-0 \
// walkSlice walks an OSLICE, OSLICEARR, OSLICESTR, OSLICE3, or OSLICE3ARR node.
mv walkExpr1:/^\tcase ir.ONEW:/+2,/^\tcase /-2 walkNew
add walk.go:/^func walkNew/-0 \
// walkNew walks an ONEW node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OCLOSE:/+/n := n/-+ walkExpr1:/^\tcase ir.OCLOSE:/+0
mv walkExpr1:/^\tcase ir.OCLOSE:/+2,/^\tcase /-2 walkClose
add walk.go:/^func walkClose/-0 \
// walkClose walks an OCLOSE node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+/n := n/-+ walkExpr1:/^\tcase ir.OMAKECHAN:/+0
mv walkExpr1:/^\tcase ir.OMAKECHAN:/+2,/^\tcase /-2 walkMakeChan
add walk.go:/^func walkMakeChan/-0 \
// walkMakeChan walks an OMAKECHAN node.
mv walkExpr1:/^\tcase ir.OMAKEMAP:/+2,/^\tcase /-2 walkMakeMap
add walk.go:/^func walkMakeMap/-0 \
// walkMakeMap walks an OMAKEMAP node.
mv walkExpr1:/^\tcase ir.OMAKESLICE:/+2,/^\tcase /-2 walkMakeSlice
add walk.go:/^func walkMakeSlice/-0 \
// walkMakeSlice walks an OMAKESLICE node.
mv walkExpr1:/^\tcase ir.OMAKESLICECOPY:/+2,/^\tcase /-2 walkMakeSliceCopy
add walk.go:/^func walkMakeSliceCopy/-0 \
// walkMakeSliceCopy walks an OMAKESLICECOPY node.
mv walkExpr1:/^\tcase ir.ORUNESTR:/+2,/^\tcase /-2 walkRuneToString
add walk.go:/^func walkRuneToString/-0 \
// walkRuneToString walks an ORUNESTR node.
mv walkExpr1:/^\tcase ir.OBYTES2STR,/+2,/^\tcase /-2 walkBytesRunesToString
add walk.go:/^func walkBytesRunesToString/-0 \
// walkBytesRunesToString walks an OBYTES2STR or ORUNES2STR node.
mv walkExpr1:/^\tcase ir.OBYTES2STRTMP:/+2,/^\tcase /-2 walkBytesToStringTemp
add walk.go:/^func walkBytesToStringTemp/-0 \
// walkBytesToStringTemp walks an OBYTES2STRTMP node.
mv walkExpr1:/^\tcase ir.OSTR2BYTES:/+2,/^\tcase /-2 walkStringToBytes
add walk.go:/^func walkStringToBytes/-0 \
// walkStringToBytes walks an OSTR2BYTES node.
# move type assertion above comment
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+/n := n/-+ walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+0
mv walkExpr1:/^\tcase ir.OSTR2BYTESTMP:/+2,/^\tcase /-2 walkStringToBytesTemp
add walk.go:/^func walkStringToBytesTemp/-0 \
// walkStringToBytesTemp walks an OSTR2BYTESTMP node.
mv walkExpr1:/^\tcase ir.OSTR2RUNES:/+2,/^\tcase /-2 walkStringToRunes
add walk.go:/^func walkStringToRunes/-0 \
// walkStringToRunes walks an OSTR2RUNES node.
mv walkExpr1:/^\tcase ir.OARRAYLIT,/+1,/^\tcase /-2 walkCompLit
add walk.go:/^func walkCompLit/-0 \
// walkCompLit walks a composite literal node: \
// OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT (all CompLitExpr), or OPTRLIT (AddrExpr).
mv walkExpr1:/^\tcase ir.OSEND:/+2,/^\tcase /-2 walkSend
add walk.go:/^func walkSend/-0 \
// walkSend walks an OSEND node.
mv walkStmt walkStmtList \
walkDecl \
walkFor \
walkGoDefer \
walkIf \
wrapCall \
stmt.go
mv walkExpr walkExpr1 walkExprList walkExprListCheap walkExprListSafe \
cheapExpr safeExpr copyExpr \
walkAddString \
walkCall \
walkCall1 \
walkDivMod \
walkDot \
walkDotType \
walkIndex \
walkIndexMap \
walkLogical \
walkSend \
walkSlice \
walkSliceHeader \
reduceSlice \
bounded \
usemethod \
usefield \
expr.go
mv \
walkAssign \
walkAssignDotType \
walkAssignFunc \
walkAssignList \
walkAssignMapRead \
walkAssignRecv \
walkReturn \
fncall \
ascompatee \
ascompatee1 \
ascompatet \
reorder3 \
reorder3save \
aliased \
anyAddrTaken \
refersToName \
refersToCommonName \
appendSlice \
isAppendOfMake \
extendSlice \
assign.go
mv \
walkCompare \
walkCompareInterface \
walkCompareString \
finishCompare \
eqFor \
brcom \
brrev \
tracecmpArg \
canMergeLoads \
compare.go
mv \
walkConv \
walkConvInterface \
walkBytesRunesToString \
walkBytesToStringTemp \
walkRuneToString \
walkStringToBytes \
walkStringToBytesTemp \
walkStringToRunes \
convFuncName \
rtconvfn \
byteindex \
walkCheckPtrAlignment \
walkCheckPtrArithmetic \
convert.go
mv \
walkAppend \
walkClose \
walkCopy \
walkDelete \
walkLenCap \
walkMakeChan \
walkMakeMap \
walkMakeSlice \
walkMakeSliceCopy \
walkNew \
walkPrint \
badtype \
callnew \
writebarrierfn \
isRuneCount \
builtin.go
mv \
walkCompLit \
sinit.go \
complit.go
mv subr.go walk.go
'
Change-Id: Ie0cf3ba4adf363c120c134d57cb7ef37934eaab9
Reviewed-on: https://go-review.googlesource.com/c/go/+/279430
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 01:07:07 -05:00
|
|
|
func badtype(op ir.Op, tl, tr *types.Type) {
|
|
|
|
var s string
|
|
|
|
if tl != nil {
|
|
|
|
s += fmt.Sprintf("\n\t%v", tl)
|
|
|
|
}
|
|
|
|
if tr != nil {
|
|
|
|
s += fmt.Sprintf("\n\t%v", tr)
|
|
|
|
}
|
|
|
|
|
|
|
|
// common mistake: *struct and *interface.
|
|
|
|
if tl != nil && tr != nil && tl.IsPtr() && tr.IsPtr() {
|
|
|
|
if tl.Elem().IsStruct() && tr.Elem().IsInterface() {
|
|
|
|
s += "\n\t(*struct vs *interface)"
|
|
|
|
} else if tl.Elem().IsInterface() && tr.Elem().IsStruct() {
|
|
|
|
s += "\n\t(*interface vs *struct)"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
base.Errorf("illegal types for operand: %v%s", op, s)
|
|
|
|
}
|
|
|
|
|
|
|
|
func writebarrierfn(name string, l *types.Type, r *types.Type) ir.Node {
|
|
|
|
fn := typecheck.LookupRuntime(name)
|
|
|
|
fn = typecheck.SubstArgTypes(fn, l, r)
|
|
|
|
return fn
|
|
|
|
}
|
|
|
|
|
|
|
|
// isRuneCount reports whether n is of the form len([]rune(string)).
|
|
|
|
// These are optimized into a call to runtime.countrunes.
|
|
|
|
func isRuneCount(n ir.Node) bool {
|
|
|
|
return base.Flag.N == 0 && !base.Flag.Cfg.Instrumenting && n.Op() == ir.OLEN && n.(*ir.UnaryExpr).X.Op() == ir.OSTR2RUNES
|
|
|
|
}
|
2023-05-23 11:23:48 +07:00
|
|
|
|
|
|
|
// isByteCount reports whether n is of the form len(string([]byte)).
|
|
|
|
func isByteCount(n ir.Node) bool {
|
|
|
|
return base.Flag.N == 0 && !base.Flag.Cfg.Instrumenting && n.Op() == ir.OLEN &&
|
|
|
|
(n.(*ir.UnaryExpr).X.Op() == ir.OBYTES2STR || n.(*ir.UnaryExpr).X.Op() == ir.OBYTES2STRTMP)
|
|
|
|
}
|