diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2020-01-07 23:13:24 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2020-01-07 23:13:24 +0000 |
commit | 81f025b580be6ce933f0ecb1f96445a3bb4fff4b (patch) | |
tree | 593e3698208109bb3b3071e6498865ec327c4f34 /libgo | |
parent | 7010bcd1c80e2a89f43c064ba21289df8c67a84c (diff) | |
download | gcc-81f025b580be6ce933f0ecb1f96445a3bb4fff4b.zip gcc-81f025b580be6ce933f0ecb1f96445a3bb4fff4b.tar.gz gcc-81f025b580be6ce933f0ecb1f96445a3bb4fff4b.tar.bz2 |
compiler, runtime: stop using __go_runtime_error
Use specific panic functions instead, which are mostly already in the
runtime package.
Also correct "defer nil" to panic when we execute the defer, rather
than throw when we queue it.
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/213642
From-SVN: r279979
Diffstat (limited to 'libgo')
-rw-r--r-- | libgo/Makefile.am | 1 | ||||
-rw-r--r-- | libgo/Makefile.in | 18 | ||||
-rw-r--r-- | libgo/go/runtime/panic.go | 2 | ||||
-rw-r--r-- | libgo/go/runtime/proc.go | 8 | ||||
-rw-r--r-- | libgo/go/runtime/slice.go | 2 | ||||
-rw-r--r-- | libgo/runtime/go-runtime-error.c | 124 |
6 files changed, 19 insertions, 136 deletions
diff --git a/libgo/Makefile.am b/libgo/Makefile.am index 1700941..4b2dd58 100644 --- a/libgo/Makefile.am +++ b/libgo/Makefile.am @@ -438,7 +438,6 @@ runtime_files = \ runtime/go-now.c \ runtime/go-nosys.c \ runtime/go-reflect-call.c \ - runtime/go-runtime-error.c \ runtime/go-setenv.c \ runtime/go-signal.c \ runtime/go-unsafe-pointer.c \ diff --git a/libgo/Makefile.in b/libgo/Makefile.in index 0596b54..72c6f9c 100644 --- a/libgo/Makefile.in +++ b/libgo/Makefile.in @@ -242,13 +242,13 @@ am__objects_4 = runtime/aeshash.lo runtime/go-assert.lo \ runtime/go-matherr.lo runtime/go-memclr.lo \ runtime/go-memequal.lo runtime/go-nanotime.lo \ runtime/go-now.lo runtime/go-nosys.lo \ - runtime/go-reflect-call.lo runtime/go-runtime-error.lo \ - runtime/go-setenv.lo runtime/go-signal.lo \ - runtime/go-unsafe-pointer.lo runtime/go-unsetenv.lo \ - runtime/go-unwind.lo runtime/go-varargs.lo \ - runtime/env_posix.lo runtime/panic.lo runtime/print.lo \ - runtime/proc.lo runtime/runtime_c.lo runtime/stack.lo \ - runtime/yield.lo $(am__objects_2) $(am__objects_3) + runtime/go-reflect-call.lo runtime/go-setenv.lo \ + runtime/go-signal.lo runtime/go-unsafe-pointer.lo \ + runtime/go-unsetenv.lo runtime/go-unwind.lo \ + runtime/go-varargs.lo runtime/env_posix.lo runtime/panic.lo \ + runtime/print.lo runtime/proc.lo runtime/runtime_c.lo \ + runtime/stack.lo runtime/yield.lo $(am__objects_2) \ + $(am__objects_3) am_libgo_llgo_la_OBJECTS = $(am__objects_4) libgo_llgo_la_OBJECTS = $(am_libgo_llgo_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) @@ -884,7 +884,6 @@ runtime_files = \ runtime/go-now.c \ runtime/go-nosys.c \ runtime/go-reflect-call.c \ - runtime/go-runtime-error.c \ runtime/go-setenv.c \ runtime/go-signal.c \ runtime/go-unsafe-pointer.c \ @@ -1333,8 +1332,6 @@ runtime/go-nosys.lo: runtime/$(am__dirstamp) \ runtime/$(DEPDIR)/$(am__dirstamp) runtime/go-reflect-call.lo: runtime/$(am__dirstamp) \ runtime/$(DEPDIR)/$(am__dirstamp) -runtime/go-runtime-error.lo: runtime/$(am__dirstamp) \ - runtime/$(DEPDIR)/$(am__dirstamp) runtime/go-setenv.lo: runtime/$(am__dirstamp) \ runtime/$(DEPDIR)/$(am__dirstamp) runtime/go-signal.lo: runtime/$(am__dirstamp) \ @@ -1398,7 +1395,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-nosys.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-now.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-reflect-call.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-runtime-error.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-setenv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-signal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-unsafe-pointer.Plo@am__quote@ diff --git a/libgo/go/runtime/panic.go b/libgo/go/runtime/panic.go index 2a11f932..9667181 100644 --- a/libgo/go/runtime/panic.go +++ b/libgo/go/runtime/panic.go @@ -38,6 +38,8 @@ import ( //go:linkname goPanicSlice3BU //go:linkname goPanicSlice3C //go:linkname goPanicSlice3CU +//go:linkname panicshift +//go:linkname panicdivide //go:linkname panicmem // Temporary for C code to call: //go:linkname throw diff --git a/libgo/go/runtime/proc.go b/libgo/go/runtime/proc.go index a0147cf..a025137 100644 --- a/libgo/go/runtime/proc.go +++ b/libgo/go/runtime/proc.go @@ -3157,6 +3157,14 @@ func syscall_runtime_AfterExec() { execLock.unlock() } +// panicgonil is used for gccgo as we need to use a compiler check for +// a nil func, in case we have to build a thunk. +//go:linkname panicgonil +func panicgonil() { + getg().m.throwing = -1 // do not dump full stacks + throw("go of nil func value") +} + // Create a new g running fn passing arg as the single argument. // Put it on the queue of g's waiting to run. // The compiler turns a go statement into a call to this. diff --git a/libgo/go/runtime/slice.go b/libgo/go/runtime/slice.go index c258ebd..49d5a86 100644 --- a/libgo/go/runtime/slice.go +++ b/libgo/go/runtime/slice.go @@ -12,6 +12,8 @@ import ( // For gccgo, use go:linkname to export compiler-called functions. // +//go:linkname panicmakeslicelen +//go:linkname panicmakeslicecap //go:linkname makeslice //go:linkname makeslice64 //go:linkname growslice diff --git a/libgo/runtime/go-runtime-error.c b/libgo/runtime/go-runtime-error.c deleted file mode 100644 index 8179e68..0000000 --- a/libgo/runtime/go-runtime-error.c +++ /dev/null @@ -1,124 +0,0 @@ -/* go-runtime-error.c -- Go runtime error. - - Copyright 2010 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" - -/* The compiler generates calls to this function. This enum values - are known to the compiler and used by compiled code. Any change - here must be reflected in the compiler. */ - -enum -{ - /* Slice index out of bounds: negative or larger than the length of - the slice. */ - SLICE_INDEX_OUT_OF_BOUNDS = 0, - - /* Array index out of bounds. */ - ARRAY_INDEX_OUT_OF_BOUNDS = 1, - - /* String index out of bounds. */ - STRING_INDEX_OUT_OF_BOUNDS = 2, - - /* Slice slice out of bounds: negative or larger than the length of - the slice or high bound less than low bound. */ - SLICE_SLICE_OUT_OF_BOUNDS = 3, - - /* Array slice out of bounds. */ - ARRAY_SLICE_OUT_OF_BOUNDS = 4, - - /* String slice out of bounds. */ - STRING_SLICE_OUT_OF_BOUNDS = 5, - - /* Dereference of nil pointer. This is used when there is a - dereference of a pointer to a very large struct or array, to - ensure that a gigantic array is not used a proxy to access random - memory locations. */ - NIL_DEREFERENCE = 6, - - /* Slice length out of bounds in make: negative or overflow or length - greater than capacity. */ - MAKE_SLICE_LEN_OUT_OF_BOUNDS = 7, - - /* Slice capacity out of bounds in make: negative. */ - MAKE_SLICE_CAP_OUT_OF_BOUNDS = 8, - - /* Map capacity out of bounds in make: negative or overflow. */ - MAKE_MAP_OUT_OF_BOUNDS = 9, - - /* Channel capacity out of bounds in make: negative or overflow. */ - MAKE_CHAN_OUT_OF_BOUNDS = 10, - - /* Integer division by zero. */ - DIVISION_BY_ZERO = 11, - - /* Go statement with nil function. */ - GO_NIL = 12, - - /* Shift by negative value. */ - SHIFT_BY_NEGATIVE = 13 -}; - -extern void __go_runtime_error (int32) __attribute__ ((noreturn)); - -void -__go_runtime_error (int32 i) -{ - struct funcfileline_return fileline; - bool in_runtime; - - fileline = runtime_funcfileline ((uintptr) runtime_getcallerpc()-1, 0); - in_runtime = (fileline.retfn.len > 0 - && (__builtin_strncmp ((const char *) fileline.retfn.str, - "runtime.", 8) - == 0)); - - switch (i) - { - case SLICE_INDEX_OUT_OF_BOUNDS: - case ARRAY_INDEX_OUT_OF_BOUNDS: - case STRING_INDEX_OUT_OF_BOUNDS: - if (in_runtime) - runtime_throw ("index out of range"); - runtime_panicstring ("index out of range"); - - case SLICE_SLICE_OUT_OF_BOUNDS: - case ARRAY_SLICE_OUT_OF_BOUNDS: - case STRING_SLICE_OUT_OF_BOUNDS: - if (in_runtime) - runtime_throw ("slice bounds out of range"); - runtime_panicstring ("slice bounds out of range"); - - case NIL_DEREFERENCE: - runtime_panicstring ("nil pointer dereference"); - - case MAKE_SLICE_LEN_OUT_OF_BOUNDS: - runtime_panicstring ("make slice len out of range"); - - case MAKE_SLICE_CAP_OUT_OF_BOUNDS: - runtime_panicstring ("make slice cap out of range"); - - case MAKE_MAP_OUT_OF_BOUNDS: - runtime_panicstring ("make map len out of range"); - - case MAKE_CHAN_OUT_OF_BOUNDS: - runtime_panicstring ("make chan len out of range"); - - case DIVISION_BY_ZERO: - runtime_panicstring ("integer divide by zero"); - - case GO_NIL: - /* This one is a throw, rather than a panic. Set throwing to - not dump full stacks. */ - runtime_g()->m->throwing = -1; - runtime_throw ("go of nil func value"); - - case SHIFT_BY_NEGATIVE: - runtime_panicstring ("negative shift amount"); - - default: - runtime_panicstring ("unknown runtime error"); - } -} |