From 1423c90a66984595686b339775b9bfcf2751d376 Mon Sep 17 00:00:00 2001 From: ian Date: Thu, 18 Jan 2018 04:24:48 +0000 Subject: [PATCH] PR go/83787 compiler: pass int to makechan, call makechan64 when appropriate The update to 1.10beta1 changed makechan to take int instead of int64, and added a makechan64 call for large values. Since the size is the last argument to makechan, the old compiler which always passed a 64-bit int worked fine on 64-bit systems and little-endian 32-bit systems, but broke on big-endian 32-bit systems. This CL fixes the compiler to use the appropriate types. This fixes GCC PR 83787. Reviewed-on: https://go-review.googlesource.com/88077 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@256835 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/go/gofrontend/MERGE | 2 +- gcc/go/gofrontend/escape.cc | 4 ++++ gcc/go/gofrontend/expressions.cc | 5 ++++- gcc/go/gofrontend/runtime.def | 3 ++- libgo/go/runtime/chan.go | 1 + 5 files changed, 12 insertions(+), 3 deletions(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index e7b959f850e..93e7215271e 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -1072286ca9249bd6f75628aead325a66286bcf5b +925635f067d40d30acf565b620cc859ee7cbc990 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/gcc/go/gofrontend/escape.cc b/gcc/go/gofrontend/escape.cc index 7bab3cbdd4a..4f95945e230 100644 --- a/gcc/go/gofrontend/escape.cc +++ b/gcc/go/gofrontend/escape.cc @@ -360,6 +360,7 @@ Node::op_format() const break; case Runtime::MAKECHAN: + case Runtime::MAKECHAN64: case Runtime::MAKEMAP: case Runtime::MAKESLICE: case Runtime::MAKESLICE64: @@ -1602,6 +1603,7 @@ Escape_analysis_assign::expression(Expression** pexpr) switch (fe->runtime_code()) { case Runtime::MAKECHAN: + case Runtime::MAKECHAN64: case Runtime::MAKEMAP: case Runtime::MAKESLICE: case Runtime::MAKESLICE64: @@ -2284,6 +2286,7 @@ Escape_analysis_assign::assign(Node* dst, Node* src) switch (fe->runtime_code()) { case Runtime::MAKECHAN: + case Runtime::MAKECHAN64: case Runtime::MAKEMAP: case Runtime::MAKESLICE: case Runtime::MAKESLICE64: @@ -3056,6 +3059,7 @@ Escape_analysis_flood::flood(Level level, Node* dst, Node* src, switch (call->fn()->func_expression()->runtime_code()) { case Runtime::MAKECHAN: + case Runtime::MAKECHAN64: case Runtime::MAKEMAP: case Runtime::MAKESLICE: case Runtime::MAKESLICE64: diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 99fb1b59ade..47be82f823e 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -7565,7 +7565,10 @@ Builtin_call_expression::lower_make(Statement_inserter* inserter) else if (is_chan) { Expression* type_arg = Expression::make_type_descriptor(type, type_loc); - call = Runtime::make_call(Runtime::MAKECHAN, loc, 2, type_arg, len_arg); + Runtime::Function code = Runtime::MAKECHAN; + if (!len_small) + code = Runtime::MAKECHAN64; + call = Runtime::make_call(code, loc, 2, type_arg, len_arg); } else go_unreachable(); diff --git a/gcc/go/gofrontend/runtime.def b/gcc/go/gofrontend/runtime.def index 605bcff4a0f..fdb159e5505 100644 --- a/gcc/go/gofrontend/runtime.def +++ b/gcc/go/gofrontend/runtime.def @@ -139,7 +139,8 @@ DEF_GO_RUNTIME(MAPITERNEXT, "runtime.mapiternext", P1(POINTER), R0()) // Make a channel. -DEF_GO_RUNTIME(MAKECHAN, "runtime.makechan", P2(TYPE, INT64), R1(CHAN)) +DEF_GO_RUNTIME(MAKECHAN, "runtime.makechan", P2(TYPE, INT), R1(CHAN)) +DEF_GO_RUNTIME(MAKECHAN64, "runtime.makechan64", P2(TYPE, INT64), R1(CHAN)) // Send a value on a channel. DEF_GO_RUNTIME(CHANSEND, "runtime.chansend1", P2(CHAN, POINTER), R0()) diff --git a/libgo/go/runtime/chan.go b/libgo/go/runtime/chan.go index 8db728d5430..bf708aec5c4 100644 --- a/libgo/go/runtime/chan.go +++ b/libgo/go/runtime/chan.go @@ -26,6 +26,7 @@ import ( // themselves, so that the compiler will export them. // //go:linkname makechan runtime.makechan +//go:linkname makechan64 runtime.makechan64 //go:linkname chansend1 runtime.chansend1 //go:linkname chanrecv1 runtime.chanrecv1 //go:linkname chanrecv2 runtime.chanrecv2 -- 2.11.4.GIT