diff options
author | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-12 15:23:33 +0000 |
---|---|---|
committer | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-12 15:23:33 +0000 |
commit | 9456798d72d0e81a2a553287f436dcb05cff175a (patch) | |
tree | 1e80106d0c4f828b72deb6e782c20d788c0dd818 /gcc/c-family/c-common.c | |
parent | e89aee4174fe58eaba553027558144a0f423960c (diff) | |
download | gcc-9456798d72d0e81a2a553287f436dcb05cff175a.tar.gz |
[./]
2013-11-12 Basile Starynkevitch <basile@starynkevitch.net>
{{merge with trunk GCC 4.9 svn rev 204695; previous trunk merge
was 202773; very unstable...}}
[gcc/]
2013-11-11 Basile Starynkevitch <basile@starynkevitch.net>
{{merge with trunk GCC 4.9 svn rev 204695; very unstable}}
* melt-runtime.h (MELT_VERSION_STRING): Bump to "1.0.1+".
* melt-run.proto.h: Update copyright years.
include tree-cfg.h instead of tree-flow.h for GCC 4.9.
* melt-runtime.cc: Include tree-cfg.h not tree-flow.h for GCC 4.9.
(meltgc_walk_gimple_seq): Fatal error with GCC 4.9 since the
walk_use_def_chains function disappeared from GCC...
* melt/xtramelt-ana-gimple.melt (walk_gimple_seq)
(walk_gimple_seq_unique_tree): issue some #warning-s for GCC 4.9
because walk_use_def_chains function disappeared from GCC...
* melt/xtramelt-probe.melt (probe_docmd): Issue an error since
currently the MELT probe is not usable with GCC 4.9....
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/melt-branch@204705 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/c-family/c-common.c')
-rw-r--r-- | gcc/c-family/c-common.c | 137 |
1 files changed, 129 insertions, 8 deletions
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 8ecb70cfa7c..93481b93027 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -39,7 +39,6 @@ along with GCC; see the file COPYING3. If not see #include "diagnostic.h" #include "tree-iterator.h" #include "hashtab.h" -#include "tree-mudflap.h" #include "opts.h" #include "cgraph.h" #include "target-def.h" @@ -371,6 +370,13 @@ static tree ignore_attribute (tree *, tree, tree, int, bool *); static tree handle_no_split_stack_attribute (tree *, tree, tree, int, bool *); static tree handle_fnspec_attribute (tree *, tree, tree, int, bool *); static tree handle_warn_unused_attribute (tree *, tree, tree, int, bool *); +static tree handle_returns_nonnull_attribute (tree *, tree, tree, int, bool *); +static tree handle_omp_declare_simd_attribute (tree *, tree, tree, int, + bool *); +static tree handle_omp_declare_target_attribute (tree *, tree, tree, int, + bool *); +static tree handle_bnd_variable_size_attribute (tree *, tree, tree, int, bool *); +static tree handle_bnd_legacy (tree *, tree, tree, int, bool *); static void check_function_nonnull (tree, int, tree *); static void check_nonnull_arg (void *, tree, unsigned HOST_WIDE_INT); @@ -403,8 +409,11 @@ const struct c_common_resword c_common_reswords[] = { { "_Alignas", RID_ALIGNAS, D_CONLY }, { "_Alignof", RID_ALIGNOF, D_CONLY }, + { "_Atomic", RID_ATOMIC, D_CONLY }, { "_Bool", RID_BOOL, D_CONLY }, { "_Complex", RID_COMPLEX, 0 }, + { "_Cilk_spawn", RID_CILK_SPAWN, 0 }, + { "_Cilk_sync", RID_CILK_SYNC, 0 }, { "_Imaginary", RID_IMAGINARY, D_CONLY }, { "_Decimal32", RID_DFLOAT32, D_CONLY | D_EXT }, { "_Decimal64", RID_DFLOAT64, D_CONLY | D_EXT }, @@ -747,6 +756,16 @@ const struct attribute_spec c_common_attribute_table[] = handle_fnspec_attribute, false }, { "warn_unused", 0, 0, false, false, false, handle_warn_unused_attribute, false }, + { "returns_nonnull", 0, 0, false, true, true, + handle_returns_nonnull_attribute, false }, + { "omp declare simd", 0, -1, true, false, false, + handle_omp_declare_simd_attribute, false }, + { "omp declare target", 0, 0, true, false, false, + handle_omp_declare_target_attribute, false }, + { "bnd_variable_size", 0, 0, true, false, false, + handle_bnd_variable_size_attribute, false }, + { "bnd_legacy", 0, 0, true, false, false, + handle_bnd_legacy, false }, { NULL, 0, 0, false, false, false, NULL, false } }; @@ -5054,6 +5073,7 @@ enum c_builtin_type #define DEF_FUNCTION_TYPE_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) NAME, #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) NAME, #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) NAME, +#define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8) NAME, #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME, #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME, #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME, @@ -5072,6 +5092,7 @@ enum c_builtin_type #undef DEF_FUNCTION_TYPE_5 #undef DEF_FUNCTION_TYPE_6 #undef DEF_FUNCTION_TYPE_7 +#undef DEF_FUNCTION_TYPE_8 #undef DEF_FUNCTION_TYPE_VAR_0 #undef DEF_FUNCTION_TYPE_VAR_1 #undef DEF_FUNCTION_TYPE_VAR_2 @@ -5154,6 +5175,10 @@ c_define_builtins (tree va_list_ref_type_node, tree va_list_arg_type_node) #define DEF_FUNCTION_TYPE_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ ARG6, ARG7) \ def_fn_type (ENUM, RETURN, 0, 7, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7); +#define DEF_FUNCTION_TYPE_8(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ + ARG6, ARG7, ARG8) \ + def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \ + ARG7, ARG8); #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \ def_fn_type (ENUM, RETURN, 1, 0); #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \ @@ -5204,8 +5229,8 @@ c_define_builtins (tree va_list_ref_type_node, tree va_list_arg_type_node) build_common_builtin_nodes (); - if (flag_mudflap) - mudflap_init (); + if (flag_enable_cilkplus) + cilk_init_builtins (); } /* Like get_identifier, but avoid warnings about null arguments when @@ -8000,6 +8025,38 @@ handle_fnspec_attribute (tree *node ATTRIBUTE_UNUSED, tree ARG_UNUSED (name), return NULL_TREE; } +/* Handle a "bnd_variable_size" attribute; arguments as in + struct attribute_spec.handler. */ + +static tree +handle_bnd_variable_size_attribute (tree *node, tree name, tree ARG_UNUSED (args), + int ARG_UNUSED (flags), bool *no_add_attrs) +{ + if (TREE_CODE (*node) != FIELD_DECL) + { + warning (OPT_Wattributes, "%qE attribute ignored", name); + *no_add_attrs = true; + } + + return NULL_TREE; +} + +/* Handle a "bnd_legacy" attribute; arguments as in + struct attribute_spec.handler. */ + +static tree +handle_bnd_legacy (tree *node, tree name, tree ARG_UNUSED (args), + int ARG_UNUSED (flags), bool *no_add_attrs) +{ + if (TREE_CODE (*node) != FUNCTION_DECL) + { + warning (OPT_Wattributes, "%qE attribute ignored", name); + *no_add_attrs = true; + } + + return NULL_TREE; +} + /* Handle a "warn_unused" attribute; arguments as in struct attribute_spec.handler. */ @@ -8021,6 +8078,24 @@ handle_warn_unused_attribute (tree *node, tree name, return NULL_TREE; } +/* Handle an "omp declare simd" attribute; arguments as in + struct attribute_spec.handler. */ + +static tree +handle_omp_declare_simd_attribute (tree *, tree, tree, int, bool *) +{ + return NULL_TREE; +} + +/* Handle an "omp declare target" attribute; arguments as in + struct attribute_spec.handler. */ + +static tree +handle_omp_declare_target_attribute (tree *, tree, tree, int, bool *) +{ + return NULL_TREE; +} + /* Handle a "returns_twice" attribute; arguments as in struct attribute_spec.handler. */ @@ -9014,7 +9089,7 @@ handle_optimize_attribute (tree *node, tree name, tree args, /* Parse options, and update the vector. */ parse_optimize_options (args, true); DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node) - = build_optimization_node (); + = build_optimization_node (&global_options); /* Restore current options. */ cl_optimization_restore (&global_options, &cur_opts); @@ -9048,6 +9123,23 @@ handle_no_split_stack_attribute (tree *node, tree name, return NULL_TREE; } + +/* Handle a "returns_nonnull" attribute; arguments as in + struct attribute_spec.handler. */ + +static tree +handle_returns_nonnull_attribute (tree *node, tree, tree, int, + bool *no_add_attrs) +{ + // Even without a prototype we still have a return type we can check. + if (TREE_CODE (TREE_TYPE (*node)) != POINTER_TYPE) + { + error ("returns_nonnull attribute on a function not returning a pointer"); + *no_add_attrs = true; + } + return NULL_TREE; +} + /* Check for valid arguments being passed to a function with FNTYPE. There are NARGS arguments in the array ARGARRAY. */ @@ -9474,6 +9566,7 @@ static const struct reason_option_codes_t option_codes[] = { {CPP_W_INVALID_PCH, OPT_Winvalid_pch}, {CPP_W_WARNING_DIRECTIVE, OPT_Wcpp}, {CPP_W_LITERAL_SUFFIX, OPT_Wliteral_suffix}, + {CPP_W_DATE_TIME, OPT_Wdate_time}, {CPP_W_NONE, 0} }; @@ -9843,6 +9936,11 @@ invalid_indirection_error (location_t loc, tree type, ref_operator errstring) "invalid type argument of %<->%> (have %qT)", type); break; + case RO_ARROW_STAR: + error_at (loc, + "invalid type argument of %<->*%> (have %qT)", + type); + break; case RO_IMPLICIT_CONVERSION: error_at (loc, "invalid type argument of implicit conversion (have %qT)", @@ -10075,6 +10173,7 @@ sync_resolve_params (location_t loc, tree orig_function, tree function, call to check_function_arguments what ever type the user used. */ function_args_iter_next (&iter); ptype = TREE_TYPE (TREE_TYPE ((*params)[0])); + ptype = TYPE_MAIN_VARIANT (ptype); /* For the rest of the values, we need to cast these to FTYPE, so that we don't get warnings for passing pointer types, etc. */ @@ -10304,6 +10403,27 @@ add_atomic_size_parameter (unsigned n, location_t loc, tree function, } +/* Return whether atomic operations for naturally aligned N-byte + arguments are supported, whether inline or through libatomic. */ +static bool +atomic_size_supported_p (int n) +{ + switch (n) + { + case 1: + case 2: + case 4: + case 8: + return true; + + case 16: + return targetm.scalar_mode_supported_p (TImode); + + default: + return false; + } +} + /* This will process an __atomic_exchange function call, determine whether it needs to be mapped to the _N variation, or turned into a library call. LOC is the location of the builtin call. @@ -10329,7 +10449,7 @@ resolve_overloaded_atomic_exchange (location_t loc, tree function, } /* If not a lock-free size, change to the library generic format. */ - if (n != 1 && n != 2 && n != 4 && n != 8 && n != 16) + if (!atomic_size_supported_p (n)) { *new_return = add_atomic_size_parameter (n, loc, function, params); return true; @@ -10394,7 +10514,7 @@ resolve_overloaded_atomic_compare_exchange (location_t loc, tree function, } /* If not a lock-free size, change to the library generic format. */ - if (n != 1 && n != 2 && n != 4 && n != 8 && n != 16) + if (!atomic_size_supported_p (n)) { /* The library generic format does not have the weak parameter, so remove it from the param list. Since a parameter has been removed, @@ -10470,7 +10590,7 @@ resolve_overloaded_atomic_load (location_t loc, tree function, } /* If not a lock-free size, change to the library generic format. */ - if (n != 1 && n != 2 && n != 4 && n != 8 && n != 16) + if (!atomic_size_supported_p (n)) { *new_return = add_atomic_size_parameter (n, loc, function, params); return true; @@ -10530,7 +10650,7 @@ resolve_overloaded_atomic_store (location_t loc, tree function, } /* If not a lock-free size, change to the library generic format. */ - if (n != 1 && n != 2 && n != 4 && n != 8 && n != 16) + if (!atomic_size_supported_p (n)) { *new_return = add_atomic_size_parameter (n, loc, function, params); return true; @@ -11471,6 +11591,7 @@ keyword_is_type_qualifier (enum rid keyword) case RID_CONST: case RID_VOLATILE: case RID_RESTRICT: + case RID_ATOMIC: return true; default: return false; |