// Copyright 2012 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. #include "runtime.h" extern void gothrow(String) __attribute__((noreturn)); extern void gothrow(String) __asm__(GOSYM_PREFIX "runtime.throw"); void runtime_throw(const char *s) { gothrow(runtime_gostringnocopy((const byte *)s)); } void runtime_panicstring(const char *s) { G *gp; Eface err; gp = runtime_g(); if (gp == nil) { runtime_printf("panic: %s\n", s); runtime_throw("panic with no g"); } if (gp->m == nil) { runtime_printf("panic: %s\n", s); runtime_throw("panic with no m"); } if (gp->m->curg != gp) { runtime_printf("panic: %s\n", s); runtime_throw("panic on system stack"); } if (gp->m->mallocing != 0) { runtime_printf("panic: %s\n", s); runtime_throw("panic during malloc"); } if (gp->m->preemptoff.len != 0) { runtime_printf("panic: %s\n", s); runtime_printf("preempt off reason: %S\n", gp->m->preemptoff); runtime_throw("panic during preemptoff"); } if (gp->m->locks != 0) { runtime_printf("panic: %s\n", s); runtime_throw("panic holding locks"); } runtime_newErrorCString((uintptr) s, &err); runtime_panic(err); } extern void runtime_abort(void) __asm__(GOSYM_PREFIX "runtime.abort"); void runtime_abort() { abort(); }