Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cmd/compile: wrong line number generated after function call #47260

Closed
polinasok opened this issue Jul 17, 2021 · 1 comment
Closed

cmd/compile: wrong line number generated after function call #47260

polinasok opened this issue Jul 17, 2021 · 1 comment
Labels
FrozenDueToAge NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one.

Comments

@polinasok
Copy link

What version of Go are you using (go version)?

go version go1.16.6 darwin/amd64

Does this issue reproduce with the latest release?

No. Tried with both gotip & go1.17rc1.
I guess it means the bug got fixed, but submitting this issue just in case.

What operating system and processor architecture are you using (go env)?

go env Output
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/polina/Library/Caches/go-build"
GOENV="/Users/polina/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/polina/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/polina/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GOVCS=""
GOVERSION="go1.16.6"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/polina/delve/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/dn/8hszkj9x21n__1gr_p8qgjgr0007jz/T/go-build3263889025=/tmp/go-build -gno-record-gcc-switches -fno-common"

What did you do?

This is a result of an issue file against delve at go-delve/delve#2593.

package main

import "fmt"

func issue2593(z interface{}) error {

	switch t := z.(type) {
	case string:
		if err := issue2593_call(); err != nil {
			// Will go here.
			return err
		}
	default:
		fmt.Print(t)
	}

	// Then here
	return nil
}

func issue2593_call() error {
	return nil
}

func main() {
	err := issue2593("test")
	// Will print <nil>
	fmt.Print(err)
}

Dlv showed odd behavior where a breakpoint inside of the if-statement was unexpectedly hit.

What did you expect to see?

Expected not to enter the if-statement during debugging.

What did you see instead?

     6:	
     7:		switch t := z.(type) {
     8:		case string:
     9:			if err := issue2593_call(); err != nil {
    10:				// Will go here.
=>  11:				return err
    12:			}
    13:		default:
    14:			fmt.Print(t)
    15:		}
    16:	
(dlv) p err
(unreadable invalid interface type: key not found)

A snapshot of what get we from disassemble. 2nd mov after the call should not have a different line number from the rest of the call-related lines, should it?

	issue.go:8	0x10cbd11	488d0528b40000			lea rax, ptr [rip+0xb428]
	issue.go:8	0x10cbd18	4839442470			cmp qword ptr [rsp+0x70], rax
	issue.go:8	0x10cbd1d	7406				jz 0x10cbd25
	issue.go:8	0x10cbd1f	90				nop
	issue.go:8	0x10cbd20	e917010000			jmp 0x10cbe3c
	issue.go:8	0x10cbd25	b801000000			mov eax, 0x1
	issue.go:8	0x10cbd2a	eb00				jmp 0x10cbd2c
	issue.go:8	0x10cbd2c	88442433			mov byte ptr [rsp+0x33], al
	issue.go:8	0x10cbd30	84c0				test al, al
	issue.go:8	0x10cbd32	7502				jnz 0x10cbd36
	issue.go:8	0x10cbd34	eb76				jmp 0x10cbdac
	issue.go:8	0x10cbd36	eb00				jmp 0x10cbd38
	issue.go:8	0x10cbd38	488b442478			mov rax, qword ptr [rsp+0x78]
	issue.go:8	0x10cbd3d	488b08				mov rcx, qword ptr [rax]
	issue.go:8	0x10cbd40	488b4008			mov rax, qword ptr [rax+0x8]
	issue.go:8	0x10cbd44	48894c2450			mov qword ptr [rsp+0x50], rcx
	issue.go:8	0x10cbd49	4889442458			mov qword ptr [rsp+0x58], rax
	issue.go:9	0x10cbd4e	e80d010000			call $main.issue2593_call
	issue.go:9	0x10cbd53	488b442408			mov rax, qword ptr [rsp+0x8]
=>	issue.go:11	0x10cbd58*	488b0c24			mov rcx, qword ptr [rsp]
	issue.go:9	0x10cbd5c	48833c2400			cmp qword ptr [rsp], 0x0
	issue.go:9	0x10cbd61	48894c2460			mov qword ptr [rsp+0x60], rcx
	issue.go:9	0x10cbd66	4889442468			mov qword ptr [rsp+0x68], rax
	issue.go:9	0x10cbd6b	7502				jnz 0x10cbd6f
	issue.go:9	0x10cbd6d	eb20				jmp 0x10cbd8f
	issue.go:11	0x10cbd6f	48898c24c8000000		mov qword ptr [rsp+0xc8], rcx
	issue.go:11	0x10cbd77	48898424d0000000		mov qword ptr [rsp+0xd0], rax
	issue.go:11	0x10cbd7f	488bac24a8000000		mov rbp, qword ptr [rsp+0xa8]
	issue.go:11	0x10cbd87	4881c4b0000000			add rsp, 0xb0
	issue.go:11	0x10cbd8e	c3				ret
	issue.go:7	0x10cbd8f	eb00				jmp 0x10cbd91

With @heschi's help, used GOSSAFUNC=issue2593 go build -gcflags=all="-N -l" issue.go to get ssa.html, which shows same oddly numbered mov:
image

ssa.html.zip

@dr2chase @randall77

@seankhliao seankhliao added the NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one. label Jul 17, 2021
@randall77
Copy link
Contributor

This is fixed on all supported versions, so I'm going to close it.

It may have been fixed just by accident due to the regabi changes. The underlying bug may still exist. Please reopen with a new reproducer if you find such an example.

@golang golang locked and limited conversation to collaborators Jun 23, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
FrozenDueToAge NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one.
Projects
None yet
Development

No branches or pull requests

5 participants