runtime: add precise stack scan support

This CL adds support of precise stack scan using stack maps to
the runtime. The stack maps are generated by the compiler (if
supported). Each safepoint is associated with a (real or dummy)
landing pad, and its "type info" in the exception table is a
pointer to the stack map. When a stack is scanned, the stack map
is found by the stack unwinding code by inspecting the exception
table (LSDA).

For precise stack scan we need to unwind the stack. There are
three cases:

- If a goroutine is scanning its own stack, it can unwind the
  stack and scan the frames.

- If a goroutine is scanning another, stopped, goroutine, it
  cannot directly unwind the target stack. We handle this by
  switching (runtime.gogo) to the target g, letting it unwind
  and scan the stack, and switch back.

- If we are scanning a goroutine that is blocked in a syscall,
  we send a signal to the target goroutine's thread, and let the
  signal handler unwind and scan the stack. Extra care is needed
  as this races with enter/exit syscall.

Currently this is only implemented on linux.

Change-Id: I065894277741c2cacce703ce7489e8979b3d0aac
Reviewed-by: Ian Lance Taylor <>
12 files changed