diff options
Diffstat (limited to 'gcc/ipa-hello-world.c')
-rw-r--r-- | gcc/ipa-hello-world.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/gcc/ipa-hello-world.c b/gcc/ipa-hello-world.c index 85092f85453..cbe293d2df0 100644 --- a/gcc/ipa-hello-world.c +++ b/gcc/ipa-hello-world.c @@ -218,15 +218,41 @@ is_function_escaping(cgraph_node *cnode) } void +calculate_escaping_parameters(cgraph_node *cnode, type_map &escape_map) +{ + tree function = cnode->decl; + gcc_assert(function); + enum tree_code code = TREE_CODE (function); + bool is_function_decl = FUNCTION_DECL == code; + gcc_assert (is_function_decl); + + bool is_escaping = is_function_escaping(cnode); + for (tree parm = DECL_ARGUMENTS (function); parm; parm = DECL_CHAIN(parm)) + { + tree decl_name = DECL_NAME(parm); + gcc_assert(decl_name); + const char* identifier = IDENTIFIER_POINTER(decl_name); + gcc_assert(identifier); + tree tree_type = TREE_TYPE(parm); + gcc_assert(tree_type); + escaping_info *info = escape_map.get(tree_type); + gcc_assert(info); + info->is_escaping |= is_escaping; + log("variable %s is escaping %s\n", identifier, is_escaping ? "true" : "false"); + } +} + +void is_any_function_escaping(type_map &escape_map) { cgraph_node *cnode = NULL; FOR_EACH_FUNCTION (cnode) { + cnode->get_untransformed_body(); log("function name = %s\n", cnode->name()); bool is_escaping = is_function_escaping(cnode); log("function %s is escaping %s\n", cnode->name(), is_escaping ? "true" : "false"); - + calculate_escaping_parameters(cnode, escape_map); } } @@ -245,8 +271,6 @@ is_any_variable_escaping(type_map &escape_map) gcc_assert(type); escaping_info *info = escape_map.get(type); gcc_assert(info); - // If there is any variable of this type that escapes. - // This type will escape info->is_escaping |= is_escaping; } } |