From ad5b68e0afd71857e219161266f5a7001bfcbd24 Mon Sep 17 00:00:00 2001 From: Chris Manghane Date: Wed, 30 Apr 2014 17:55:59 +0000 Subject: [PATCH] compiler: Remove GCC langhooks from frontend proper. * go-lang.c (go_langhook_type_for_size): Do it here, rather than calling into Go frontend. (go_langhook_type_for_mode): Likewise. * go-c.h (go_type_for_size, go_type_for_mode): Don't declare. From-SVN: r209945 --- gcc/go/ChangeLog | 7 +++ gcc/go/go-c.h | 3 -- gcc/go/go-lang.c | 70 ++++++++++++++++++++++++++-- gcc/go/gofrontend/gogo-tree.cc | 85 ---------------------------------- 4 files changed, 73 insertions(+), 92 deletions(-) diff --git a/gcc/go/ChangeLog b/gcc/go/ChangeLog index 8d86e746d6e..2bb10ed9b1c 100644 --- a/gcc/go/ChangeLog +++ b/gcc/go/ChangeLog @@ -1,3 +1,10 @@ +2014-04-30 Chris Manghane + + * go-lang.c (go_langhook_type_for_size): Do it here, rather than + calling into Go frontend. + (go_langhook_type_for_mode): Likewise. + * go-c.h (go_type_for_size, go_type_for_mode): Don't declare. + 2014-04-30 Chris Manghane * go-gcc.cc: #include "langhooks.h". diff --git a/gcc/go/go-c.h b/gcc/go/go-c.h index cf0fbfb0a3f..d5cf48f04e6 100644 --- a/gcc/go/go-c.h +++ b/gcc/go/go-c.h @@ -41,9 +41,6 @@ extern void go_parse_input_files (const char**, unsigned int, bool require_return_statement); extern void go_write_globals (void); -extern tree go_type_for_size (unsigned int bits, int unsignedp); -extern tree go_type_for_mode (enum machine_mode, int unsignedp); - /* Functions defined in the GCC interface called by the Go frontend proper. */ diff --git a/gcc/go/go-lang.c b/gcc/go/go-lang.c index c0f2f1f3884..3599aa85e54 100644 --- a/gcc/go/go-lang.c +++ b/gcc/go/go-lang.c @@ -288,7 +288,38 @@ go_langhook_parse_file (void) static tree go_langhook_type_for_size (unsigned int bits, int unsignedp) { - return go_type_for_size (bits, unsignedp); + tree type; + if (unsignedp) + { + if (bits == INT_TYPE_SIZE) + type = unsigned_type_node; + else if (bits == CHAR_TYPE_SIZE) + type = unsigned_char_type_node; + else if (bits == SHORT_TYPE_SIZE) + type = short_unsigned_type_node; + else if (bits == LONG_TYPE_SIZE) + type = long_unsigned_type_node; + else if (bits == LONG_LONG_TYPE_SIZE) + type = long_long_unsigned_type_node; + else + type = make_unsigned_type(bits); + } + else + { + if (bits == INT_TYPE_SIZE) + type = integer_type_node; + else if (bits == CHAR_TYPE_SIZE) + type = signed_char_type_node; + else if (bits == SHORT_TYPE_SIZE) + type = short_integer_type_node; + else if (bits == LONG_TYPE_SIZE) + type = long_integer_type_node; + else if (bits == LONG_LONG_TYPE_SIZE) + type = long_long_integer_type_node; + else + type = make_signed_type(bits); + } + return type; } static tree @@ -309,9 +340,40 @@ go_langhook_type_for_mode (enum machine_mode mode, int unsignedp) return NULL_TREE; } - type = go_type_for_mode (mode, unsignedp); - if (type) - return type; + // FIXME: This static_cast should be in machmode.h. + enum mode_class mc = static_cast(GET_MODE_CLASS(mode)); + if (mc == MODE_INT) + return go_langhook_type_for_size(GET_MODE_BITSIZE(mode), unsignedp); + else if (mc == MODE_FLOAT) + { + switch (GET_MODE_BITSIZE (mode)) + { + case 32: + return float_type_node; + case 64: + return double_type_node; + default: + // We have to check for long double in order to support + // i386 excess precision. + if (mode == TYPE_MODE(long_double_type_node)) + return long_double_type_node; + } + } + else if (mc == MODE_COMPLEX_FLOAT) + { + switch (GET_MODE_BITSIZE (mode)) + { + case 64: + return complex_float_type_node; + case 128: + return complex_double_type_node; + default: + // We have to check for long double in order to support + // i386 excess precision. + if (mode == TYPE_MODE(complex_long_double_type_node)) + return complex_long_double_type_node; + } + } #if HOST_BITS_PER_WIDE_INT >= 64 /* The middle-end and some backends rely on TImode being supported diff --git a/gcc/go/gofrontend/gogo-tree.cc b/gcc/go/gofrontend/gogo-tree.cc index 5b9a8180287..9a6ffa6a040 100644 --- a/gcc/go/gofrontend/gogo-tree.cc +++ b/gcc/go/gofrontend/gogo-tree.cc @@ -35,88 +35,3 @@ saw_errors() { return errorcount != 0 || sorrycount != 0; } - -// Return the integer type to use for a size. - -GO_EXTERN_C -tree -go_type_for_size(unsigned int bits, int unsignedp) -{ - const char* name; - switch (bits) - { - case 8: - name = unsignedp ? "uint8" : "int8"; - break; - case 16: - name = unsignedp ? "uint16" : "int16"; - break; - case 32: - name = unsignedp ? "uint32" : "int32"; - break; - case 64: - name = unsignedp ? "uint64" : "int64"; - break; - default: - if (bits == POINTER_SIZE && unsignedp) - name = "uintptr"; - else - return NULL_TREE; - } - Type* type = Type::lookup_integer_type(name); - return type_to_tree(type->get_backend(go_get_gogo())); -} - -// Return the type to use for a mode. - -GO_EXTERN_C -tree -go_type_for_mode(enum machine_mode mode, int unsignedp) -{ - // FIXME: This static_cast should be in machmode.h. - enum mode_class mc = static_cast(GET_MODE_CLASS(mode)); - if (mc == MODE_INT) - return go_type_for_size(GET_MODE_BITSIZE(mode), unsignedp); - else if (mc == MODE_FLOAT) - { - Type* type; - switch (GET_MODE_BITSIZE (mode)) - { - case 32: - type = Type::lookup_float_type("float32"); - break; - case 64: - type = Type::lookup_float_type("float64"); - break; - default: - // We have to check for long double in order to support - // i386 excess precision. - if (mode == TYPE_MODE(long_double_type_node)) - return long_double_type_node; - return NULL_TREE; - } - return type_to_tree(type->get_backend(go_get_gogo())); - } - else if (mc == MODE_COMPLEX_FLOAT) - { - Type *type; - switch (GET_MODE_BITSIZE (mode)) - { - case 64: - type = Type::lookup_complex_type("complex64"); - break; - case 128: - type = Type::lookup_complex_type("complex128"); - break; - default: - // We have to check for long double in order to support - // i386 excess precision. - if (mode == TYPE_MODE(complex_long_double_type_node)) - return complex_long_double_type_node; - return NULL_TREE; - } - return type_to_tree(type->get_backend(go_get_gogo())); - } - else - return NULL_TREE; -}