How golang calls runtime.panic* functions?

I am studying the assembly output of unoptimized go build. There is a function that returns nil no matter what. During runtime go panics as expected due to nil. How does go call the runtime.panic* functions as defined in assembly source? I dont see any calls to them, just some couple of tests.

Source code:

package main

type Some struct {
	a int
} 

func getSome() *Some {
	some := 23
	if some == 40 {
		return &Some{}
	} else {
		return nil	
	}
}

func main() {
	some := getSome()
	some.a = 13
}

Assembly fragment:

0000000000457660 <main.getSome>:
  457660:	55                   	push   %rbp
  457661:	48 89 e5             	mov    %rsp,%rbp
  457664:	48 83 ec 10          	sub    $0x10,%rsp
  457668:	48 c7 44 24 08 00 00 	movq   $0x0,0x8(%rsp)
  45766f:	00 00 
  457671:	48 c7 04 24 17 00 00 	movq   $0x17,(%rsp)
  457678:	00 
  457679:	eb 00                	jmp    45767b <main.getSome+0x1b>
  45767b:	48 c7 44 24 08 00 00 	movq   $0x0,0x8(%rsp)
  457682:	00 00 
  457684:	31 c0                	xor    %eax,%eax
  457686:	48 83 c4 10          	add    $0x10,%rsp
  45768a:	5d                   	pop    %rbp
  45768b:	c3                   	ret
  45768c:	cc                   	int3
  45768d:	cc                   	int3
  45768e:	cc                   	int3
  45768f:	cc                   	int3
  457690:	cc                   	int3
  457691:	cc                   	int3
  457692:	cc                   	int3
  457693:	cc                   	int3
  457694:	cc                   	int3
  457695:	cc                   	int3
  457696:	cc                   	int3
  457697:	cc                   	int3
  457698:	cc                   	int3
  457699:	cc                   	int3
  45769a:	cc                   	int3
  45769b:	cc                   	int3
  45769c:	cc                   	int3
  45769d:	cc                   	int3
  45769e:	cc                   	int3
  45769f:	cc                   	int3

00000000004576a0 <main.main>:
  4576a0:	49 3b 66 10          	cmp    0x10(%r14),%rsp
  4576a4:	76 20                	jbe    4576c6 <main.main+0x26>
  4576a6:	55                   	push   %rbp
  4576a7:	48 89 e5             	mov    %rsp,%rbp
  4576aa:	48 83 ec 08          	sub    $0x8,%rsp
  4576ae:	e8 ad ff ff ff       	call   457660 <main.getSome>
  4576b3:	48 89 04 24          	mov    %rax,(%rsp)
  4576b7:	84 00                	test   %al,(%rax)
  4576b9:	48 c7 00 0d 00 00 00 	movq   $0xd,(%rax)
  4576c0:	48 83 c4 08          	add    $0x8,%rsp
  4576c4:	5d                   	pop    %rbp
  4576c5:	c3                   	ret
  4576c6:	e8 f5 ce ff ff       	call   4545c0 <runtime.morestack_noctxt.abi0>
  4576cb:	eb d3                	jmp    4576a0 <main.main>

Godbolt uses color to show which parts of the assembly-code belong to which Go-code

I pasted your code here:

Maybe this helps?

  • A panic function (e.g., runtime.Panic, runtime.Panicf) is called with an argument, which can be any value. This argument becomes the “panic value” associated with the error.

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.