aboutsummaryrefslogtreecommitdiff
path: root/gcc/context.h
blob: 2211dc43ee9ebc6a9569cda70f43a9b9d91d5101 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/* 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
<http://www.gnu.org/licenses/>.  */

#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 */