aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-common.c
diff options
context:
space:
mode:
authorKai Tietz <kai.tietz@onevision.com>2010-05-26 16:13:55 +0000
committerKai Tietz <ktietz@gcc.gnu.org>2010-05-26 18:13:55 +0200
commita6766312d3001a708ed8ad1bd02ccbf95bd2c671 (patch)
treea8a266122bedc642da5d3e6dbb95526bcdf6c29d /gcc/c-common.c
parent880ad25fc7968f5f3d1e9042b2c07812e01a2c99 (diff)
downloadgcc-a6766312d3001a708ed8ad1bd02ccbf95bd2c671.zip
gcc-a6766312d3001a708ed8ad1bd02ccbf95bd2c671.tar.gz
gcc-a6766312d3001a708ed8ad1bd02ccbf95bd2c671.tar.bz2
demangle-expected: Add tests for __int128 and unsigned __int128 types.
libiberty/ 2010-05-26 Kai Tietz <kai.tietz@onevision.com> * testsuite/demangle-expected: Add tests for __int128 and unsigned __int128 types. gcc/testsuite 2010-05-26 Kai Tietz <kai.tietz@onevision.com> * lib/target-supports.exp (check_effective_target_int128): New function to check if __int128 types are available for target. * testsuite/c-c++-common/int128-types-1.c: New. * testsuite/c-c++-common/int128-1.c: New. * testsuite/c-c++-common/int128-2.c: New. * g++.dg/abi/mangle43.C: New. * g++.dg/init/enum1.C: Handle __int128 case and add -Wno-overflow. * g++.dg/cpp0x/nullptr04.C: Use __SIZE_TYPE__ for getting pointer-wide scalar. * g++.dg/other/pr25632.C: Likewise. * g++.dg/other/large-size-array.C (DIM): Use ULLONG_MAX for win64 case. * g++.dg/warn/pr13358-2.C: Add llp64 for check of special overflow warnings. * g++.dg/warn/pr13358-4.C: Likewise. * g++.dg/warn/Wconversion-null-2.C: Add 'long long' case. * g++.dg/warn/Wconversion-null.C: Likewise. gcc/ 2010-05-26 Kai Tietz <kai.tietz@onevision.com> * builtin-types.def (BT_INT128): New primitive type. (BT_UINT128): Likewise. * c-common.c (c_common_r): Add __int128 keyword. (c_common_type_for_size): Handle __int128. (c_common_type_for_mode): Likewise. (c_common_signed_or_unsigned_type): Likewise. (c_common_nodes_and_builtins): Add builtin type if target supports 128-bit integer scalar. * c-common.h (enum rid): Add RID_INT128. * c-cppbuiltin.c (c_cpp_builtins): Define __SIZEOF_INT128__ if target supports 128-bit integer scalar. * c-decl.c (declspecs_add_type): Handle new keyword __int128. (finish_declspecs): Likewise. * c-parser.c (c_token_starts_typename): Handle RID_INT128. (c_token_starts_declspecs): Likewise. (c_parser_declspecs): Likewise. (c_parser_attributes): Likewise. (c_parser_objc_selector): Likewise. * c-pretty-print.c (pp_c_integer_constant): Handle __int128. * c-tree.h (enum c_typespec_keyword): Add cts_int128. * gimple.c (gimple_signed_or_unsigned_type): Handle int128 types. * tree.c (make_or_reuse_type): Likewise. (make_unsigned_type): Likewise. (build_common_tree_nodes_2): Likewise. * tree.h (enum integer_type_kind): Add itk_int128 and itk_unsigned_int128. (int128_integer_type_node): New define.. (int128_unsigned_type_node): New define. * cp/cp-tree.h (cp_decl_specifier_seq): Add new bifield explicit_int128_p. * cp/decl.c (grokdeclarator): Handle __int128. * cp/parser.c (cp_lexer_next_token_is_decl_specifier_ke): Likewise. (cp_parser_simple_type_specifier): Likewise. * cp/rtti.c (emit_support_tinfos): Add int128 nodes for rtti. * cp/typeck.c (cp_common_type): Handle __int128. * cp/mangle.c (integer_type_codes): Add itk_int128 and itk_unsigned_int128. * doc/extend.texi: Add documentation about __int128 type. From-SVN: r159879
Diffstat (limited to 'gcc/c-common.c')
-rw-r--r--gcc/c-common.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/gcc/c-common.c b/gcc/c-common.c
index cadf757..68fa9cf 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -65,10 +65,12 @@ cpp_reader *parse_in; /* Declared in c-pragma.h. */
tree short_integer_type_node;
tree long_integer_type_node;
tree long_long_integer_type_node;
+ tree int128_integer_type_node;
tree short_unsigned_type_node;
tree long_unsigned_type_node;
tree long_long_unsigned_type_node;
+ tree int128_unsigned_type_node;
tree truthvalue_type_node;
tree truthvalue_false_node;
@@ -595,6 +597,7 @@ const struct c_common_resword c_common_reswords[] =
{ "__has_trivial_copy", RID_HAS_TRIVIAL_COPY, D_CXXONLY },
{ "__has_trivial_destructor", RID_HAS_TRIVIAL_DESTRUCTOR, D_CXXONLY },
{ "__has_virtual_destructor", RID_HAS_VIRTUAL_DESTRUCTOR, D_CXXONLY },
+ { "__int128", RID_INT128, 0 },
{ "__is_abstract", RID_IS_ABSTRACT, D_CXXONLY },
{ "__is_base_of", RID_IS_BASE_OF, D_CXXONLY },
{ "__is_class", RID_IS_CLASS, D_CXXONLY },
@@ -2857,6 +2860,11 @@ c_common_type_for_size (unsigned int bits, int unsignedp)
return (unsignedp ? long_long_unsigned_type_node
: long_long_integer_type_node);
+ if (int128_integer_type_node
+ && bits == TYPE_PRECISION (int128_integer_type_node))
+ return (unsignedp ? int128_unsigned_type_node
+ : int128_integer_type_node);
+
if (bits == TYPE_PRECISION (widest_integer_literal_type_node))
return (unsignedp ? widest_unsigned_literal_type_node
: widest_integer_literal_type_node);
@@ -2935,6 +2943,10 @@ c_common_type_for_mode (enum machine_mode mode, int unsignedp)
if (mode == TYPE_MODE (long_long_integer_type_node))
return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node;
+ if (int128_integer_type_node
+ && mode == TYPE_MODE (int128_integer_type_node))
+ return unsignedp ? int128_unsigned_type_node : int128_integer_type_node;
+
if (mode == TYPE_MODE (widest_integer_literal_type_node))
return unsignedp ? widest_unsigned_literal_type_node
: widest_integer_literal_type_node;
@@ -3148,6 +3160,10 @@ c_common_signed_or_unsigned_type (int unsignedp, tree type)
return unsignedp ? long_unsigned_type_node : long_integer_type_node;
if (type1 == long_long_integer_type_node || type1 == long_long_unsigned_type_node)
return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node;
+ if (int128_integer_type_node
+ && (type1 == int128_integer_type_node
+ || type1 == int128_unsigned_type_node))
+ return unsignedp ? int128_unsigned_type_node : int128_integer_type_node;
if (type1 == widest_integer_literal_type_node || type1 == widest_unsigned_literal_type_node)
return unsignedp ? widest_unsigned_literal_type_node : widest_integer_literal_type_node;
#if HOST_BITS_PER_WIDE_INT >= 64
@@ -3262,6 +3278,9 @@ c_common_signed_or_unsigned_type (int unsignedp, tree type)
if (TYPE_OK (long_long_integer_type_node))
return (unsignedp ? long_long_unsigned_type_node
: long_long_integer_type_node);
+ if (int128_integer_type_node && TYPE_OK (int128_integer_type_node))
+ return (unsignedp ? int128_unsigned_type_node
+ : int128_integer_type_node);
if (TYPE_OK (widest_integer_literal_type_node))
return (unsignedp ? widest_unsigned_literal_type_node
: widest_integer_literal_type_node);
@@ -3305,6 +3324,10 @@ c_build_bitfield_integer_type (unsigned HOST_WIDE_INT width, int unsignedp)
if (width == TYPE_PRECISION (long_long_integer_type_node))
return (unsignedp ? long_long_unsigned_type_node
: long_long_integer_type_node);
+ if (int128_integer_type_node
+ && width == TYPE_PRECISION (int128_integer_type_node))
+ return (unsignedp ? int128_unsigned_type_node
+ : int128_integer_type_node);
return build_nonstandard_integer_type (width, unsignedp);
}
@@ -4697,6 +4720,13 @@ c_common_nodes_and_builtins (void)
record_builtin_type (RID_UNSIGNED, "unsigned int", unsigned_type_node);
record_builtin_type (RID_MAX, "long unsigned int",
long_unsigned_type_node);
+ if (int128_integer_type_node != NULL_TREE)
+ {
+ record_builtin_type (RID_INT128, "__int128",
+ int128_integer_type_node);
+ record_builtin_type (RID_MAX, "__int128 unsigned",
+ int128_unsigned_type_node);
+ }
if (c_dialect_cxx ())
record_builtin_type (RID_MAX, "unsigned long", long_unsigned_type_node);
record_builtin_type (RID_MAX, "long long int",