diff options
| author | Cuong Manh Le <cuong.manhle.vn@gmail.com> | 2022-09-28 10:20:25 +0700 |
|---|---|---|
| committer | Cuong Manh Le <cuong.manhle.vn@gmail.com> | 2023-02-04 07:02:31 +0000 |
| commit | ea3054aecc3d66409fcf1b404b58bc4767599dfa (patch) | |
| tree | 72aefc62a3b67265c22a947d96f273e2b3cee780 /src/cmd/compile/internal/reflectdata | |
| parent | 32284526c8040f59da6d487cf2c976be3ca8798c (diff) | |
| download | go-ea3054aecc3d66409fcf1b404b58bc4767599dfa.tar.xz | |
cmd/compile: factor out code to generate equal func
So next CL can use it for generating equal func during walk compare.
Passes toolstash-check.
Change-Id: I76545c1d471eb496be352908db1b05feae83fc33
Reviewed-on: https://go-review.googlesource.com/c/go/+/436435
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Diffstat (limited to 'src/cmd/compile/internal/reflectdata')
| -rw-r--r-- | src/cmd/compile/internal/reflectdata/alg.go | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/cmd/compile/internal/reflectdata/alg.go b/src/cmd/compile/internal/reflectdata/alg.go index c04de83f67..1a8b76851c 100644 --- a/src/cmd/compile/internal/reflectdata/alg.go +++ b/src/cmd/compile/internal/reflectdata/alg.go @@ -342,17 +342,27 @@ func geneq(t *types.Type) *obj.LSym { if len(closure.P) > 0 { // already generated return closure } - sym := TypeSymPrefix(".eq", t) + if base.Flag.LowerR != 0 { fmt.Printf("geneq %v\n", t) } + fn := eqFunc(t) + + // Generate a closure which points at the function we just generated. + objw.SymPtr(closure, 0, fn.Linksym(), 0) + objw.Global(closure, int32(types.PtrSize), obj.DUPOK|obj.RODATA) + return closure +} + +func eqFunc(t *types.Type) *ir.Func { // Autogenerate code for equality of structs and arrays. base.Pos = base.AutogeneratedPos // less confusing than end of input typecheck.DeclContext = ir.PEXTERN // func sym(p, q *T) bool + sym := TypeSymPrefix(".eq", t) fn := typecheck.DeclFunc(sym, nil, []*ir.Field{ir.NewField(base.Pos, typecheck.Lookup("p"), types.NewPtr(t)), ir.NewField(base.Pos, typecheck.Lookup("q"), types.NewPtr(t))}, []*ir.Field{ir.NewField(base.Pos, typecheck.Lookup("r"), types.Types[types.TBOOL])}, @@ -554,11 +564,7 @@ func geneq(t *types.Type) *obj.LSym { // are shallow. fn.SetNilCheckDisabled(true) typecheck.Target.Decls = append(typecheck.Target.Decls, fn) - - // Generate a closure which points at the function we just generated. - objw.SymPtr(closure, 0, fn.Linksym(), 0) - objw.Global(closure, int32(types.PtrSize), obj.DUPOK|obj.RODATA) - return closure + return fn } func anyCall(fn *ir.Func) bool { |
