/* Header file for Nested function decomposition for GIMPLE. Copyright (C) 2013-2022 Free Software Foundation, Inc. This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see . */ #ifndef GCC_TREE_NESTED_H #define GCC_TREE_NESTED_H extern tree build_addr (tree); extern void insert_field_into_struct (tree, tree); extern void lower_nested_functions (tree); class nested_function_info { public: /* Constructor. */ nested_function_info () : origin (NULL), nested (NULL), next_nested (NULL) { } /* Copy constructor. We can not simply copy the structure, because the linked lists would go wrong. However we should never need that. */ nested_function_info (const nested_function_info &) { gcc_unreachable (); } ~nested_function_info (); /* Return nested_function_info, if available. */ static nested_function_info *get (cgraph_node *node); /* Return nested_function_info possibly creating new one. */ static nested_function_info *get_create (cgraph_node *node); /* Release all nested_function_infos. */ static void release (void); /* For nested functions points to function the node is nested in. */ cgraph_node *origin; /* Points to first nested function, if any. */ cgraph_node *nested; /* Pointer to the next function with same origin, if any. */ cgraph_node *next_nested; }; extern void maybe_record_nested_function (cgraph_node *node); extern void unnest_function (cgraph_node *node); /* If there are functions nested in NODE, return first one. */ inline cgraph_node * first_nested_function (cgraph_node *node) { nested_function_info *info = nested_function_info::get (node); return info ? info->nested : NULL; } /* Return next nested function (used to iterate from first_nested_function). */ inline cgraph_node * next_nested_function (cgraph_node *node) { return nested_function_info::get (node)->next_nested; } /* Return origin of nested function (and NULL otherwise). */ inline cgraph_node * nested_function_origin (cgraph_node *node) { nested_function_info *info = nested_function_info::get (node); return info ? info->origin : NULL; } #endif /* GCC_TREE_NESTED_H */