Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===- llvm/CodeGen/GCStrategy.h - Garbage collection -----------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// GCStrategy coordinates code generation algorithms and implements some itself
10
// in order to generate code compatible with a target code generator as
11
// specified in a function's 'gc' attribute. Algorithms are enabled by setting
12
// flags in a subclass's constructor, and some virtual methods can be
13
// overridden.
14
//
15
// GCStrategy is relevant for implementations using either gc.root or
16
// gc.statepoint based lowering strategies, but is currently focused mostly on
17
// options for gc.root.  This will change over time.
18
//
19
// When requested by a subclass of GCStrategy, the gc.root implementation will
20
// populate GCModuleInfo and GCFunctionInfo with that about each Function in
21
// the Module that opts in to garbage collection.  Specifically:
22
//
23
// - Safe points
24
//   Garbage collection is generally only possible at certain points in code.
25
//   GCStrategy can request that the collector insert such points:
26
//
27
//     - At and after any call to a subroutine
28
//     - Before returning from the current function
29
//     - Before backwards branches (loops)
30
//
31
// - Roots
32
//   When a reference to a GC-allocated object exists on the stack, it must be
33
//   stored in an alloca registered with llvm.gcoot.
34
//
35
// This information can used to emit the metadata tables which are required by
36
// the target garbage collector runtime.
37
//
38
// When used with gc.statepoint, information about safepoint and roots can be
39
// found in the binary StackMap section after code generation.  Safepoint
40
// placement is currently the responsibility of the frontend, though late
41
// insertion support is planned.
42
//
43
// The read and write barrier support can be used with either implementation.
44
//
45
//===----------------------------------------------------------------------===//
46
 
47
#ifndef LLVM_IR_GCSTRATEGY_H
48
#define LLVM_IR_GCSTRATEGY_H
49
 
50
#include "llvm/Support/Registry.h"
51
#include <optional>
52
#include <string>
53
 
54
namespace llvm {
55
 
56
class Type;
57
 
58
/// GCStrategy describes a garbage collector algorithm's code generation
59
/// requirements, and provides overridable hooks for those needs which cannot
60
/// be abstractly described.  GCStrategy objects must be looked up through
61
/// the Function.  The objects themselves are owned by the Context and must
62
/// be immutable.
63
class GCStrategy {
64
private:
65
  friend class GCModuleInfo;
66
 
67
  std::string Name;
68
 
69
protected:
70
  bool UseStatepoints = false; /// Uses gc.statepoints as opposed to gc.roots,
71
                               /// if set, NeededSafePoints and UsesMetadata
72
                               /// should be left at their default values.
73
 
74
  bool UseRS4GC = false; /// If UseStatepoints is set, this determines whether
75
                         /// the RewriteStatepointsForGC pass should rewrite
76
                         /// this function's calls.
77
                         /// This should only be set if UseStatepoints is set.
78
 
79
  bool NeededSafePoints = false;    ///< if set, calls are inferred to be safepoints
80
  bool UsesMetadata = false;     ///< If set, backend must emit metadata tables.
81
 
82
public:
83
  GCStrategy();
84
  virtual ~GCStrategy() = default;
85
 
86
  /// Return the name of the GC strategy.  This is the value of the collector
87
  /// name string specified on functions which use this strategy.
88
  const std::string &getName() const { return Name; }
89
 
90
  /// Returns true if this strategy is expecting the use of gc.statepoints,
91
  /// and false otherwise.
92
  bool useStatepoints() const { return UseStatepoints; }
93
 
94
  /** @name Statepoint Specific Properties */
95
  ///@{
96
 
97
  /// If the type specified can be reliably distinguished, returns true for
98
  /// pointers to GC managed locations and false for pointers to non-GC
99
  /// managed locations.  Note a GCStrategy can always return 'std::nullopt'
100
  /// (i.e. an empty optional indicating it can't reliably distinguish.
101
  virtual std::optional<bool> isGCManagedPointer(const Type *Ty) const {
102
    return std::nullopt;
103
  }
104
 
105
  /// Returns true if the RewriteStatepointsForGC pass should run on functions
106
  /// using this GC.
107
  bool useRS4GC() const {
108
    assert(useStatepoints() &&
109
           "GC strategy has useRS4GC but not useStatepoints set");
110
    return UseRS4GC;
111
  }
112
 
113
  ///@}
114
 
115
  /// If set, appropriate metadata tables must be emitted by the back-end
116
  /// (assembler, JIT, or otherwise). The default stackmap information can be
117
  /// found in the StackMap section as described in the documentation.
118
  bool usesMetadata() const { return UsesMetadata; }
119
 
120
  /** @name GCRoot Specific Properties
121
   * These properties and overrides only apply to collector strategies using
122
   * GCRoot.
123
   */
124
  ///@{
125
 
126
  /// True if safe points need to be inferred on call sites
127
  bool needsSafePoints() const { return NeededSafePoints; }
128
 
129
  ///@}
130
};
131
 
132
/// Subclasses of GCStrategy are made available for use during compilation by
133
/// adding them to the global GCRegistry.  This can done either within the
134
/// LLVM source tree or via a loadable plugin.  An example registeration
135
/// would be:
136
/// static GCRegistry::Add<CustomGC> X("custom-name",
137
///        "my custom supper fancy gc strategy");
138
///
139
/// Note that to use a custom GCMetadataPrinter, you must also
140
/// register your GCMetadataPrinter subclass with the
141
/// GCMetadataPrinterRegistery as well.
142
using GCRegistry = Registry<GCStrategy>;
143
 
144
/// Lookup the GCStrategy object associated with the given gc name.
145
std::unique_ptr<GCStrategy> getGCStrategy(const StringRef Name);
146
 
147
} // end namespace llvm
148
 
149
#endif // LLVM_IR_GCSTRATEGY_H