aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Manghane <cmang@google.com>2014-04-30 17:55:59 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2014-04-30 17:55:59 +0000
commitad5b68e0afd71857e219161266f5a7001bfcbd24 (patch)
treef519620c84074a2493b0229fc910b3fef8d2e5ab
parent7211512a5f817ad08e333774bd186c0c5ff48533 (diff)
downloadgcc-ad5b68e0afd71857e219161266f5a7001bfcbd24.zip
gcc-ad5b68e0afd71857e219161266f5a7001bfcbd24.tar.gz
gcc-ad5b68e0afd71857e219161266f5a7001bfcbd24.tar.bz2
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
-rw-r--r--gcc/go/ChangeLog7
-rw-r--r--gcc/go/go-c.h3
-rw-r--r--gcc/go/go-lang.c70
-rw-r--r--gcc/go/gofrontend/gogo-tree.cc85
4 files changed, 73 insertions, 92 deletions
diff --git a/gcc/go/ChangeLog b/gcc/go/ChangeLog
index 8d86e74..2bb10ed 100644
--- a/gcc/go/ChangeLog
+++ b/gcc/go/ChangeLog
@@ -1,5 +1,12 @@
2014-04-30 Chris Manghane <cmang@google.com>
+ * 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 <cmang@google.com>
+
* go-gcc.cc: #include "langhooks.h".
(Gcc_backend::Gcc_backend): Add constructor.
(Gcc_backend::lookup_function): New function.
diff --git a/gcc/go/go-c.h b/gcc/go/go-c.h
index cf0fbfb..d5cf48f 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 c0f2f1f..3599aa8 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<enum mode_class>(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 5b9a818..9a6ffa6 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<enum mode_class>(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;
-}