/* context.h - Holder for global state Copyright (C) 2013 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_CONTEXT_H #define GCC_CONTEXT_H namespace gcc { class pass_manager; /* GCC's internal state can be divided into zero or more "parallel universe" of state; an instance of this class is one such context of state. */ class GTY((user)) context { public: /* Ensure that instances are allocated within the GC-heap. */ void *operator new (std::size_t size); context(); /* Garbage-collector integration. Each context assumes it has full control of the GC-heap that it is associated with. It acts as a root for that GC-heap, owning references to within it. Note that context instances are allocated within their own GC heap. The methods are called the *first time* that the context is reached during a ggc/pch traversal, rather than every time. */ void gt_ggc_mx (); void gt_pch_nx (); void gt_pch_nx (gt_pointer_operator op, void *cookie); /* Pass-management. */ pass_manager *get_passes () { gcc_assert (passes_); return passes_; } private: /* Pass-management. */ pass_manager *passes_; }; // class context } // namespace gcc /* The global singleton context aka "g". (the name is chosen to be easy to type in a debugger). */ extern GTY(()) gcc::context *g; /* Global hooks for ggc/pch. The gcc::context class is marked with GTY((user)), which leads to gengtype creating autogenerated functions for handling context within gtype-desc.c: void gt_ggc_mx_context (void *x_p); void gt_pch_nx_context (void *x_p) void gt_pch_p_7context (void *this_obj, void *x_p, gt_pointer_operator op, void *cookie); Those functions call the following global functions the first time that the context is reached during a traversal, and the following global functions in turn simply call the corresponding methods of the context (so that they can access private fields of the context). */ inline void gt_ggc_mx (gcc::context *ctxt) { ctxt->gt_ggc_mx (); } inline void gt_pch_nx (gcc::context *ctxt) { ctxt->gt_pch_nx (); } inline void gt_pch_nx (gcc::context *ctxt, gt_pointer_operator op, void *cookie) { ctxt->gt_pch_nx (op, cookie); } #endif /* ! GCC_CONTEXT_H */