[RS4GC] Add a GCStrategy option to enable RS4GC
authorCampbell Suter <znix@znix.xyz>
Fri, 20 Jan 2023 15:00:01 +0000 (18:00 +0300)
committerDenis Antrushin <dantrushin@gmail.com>
Fri, 20 Jan 2023 19:38:17 +0000 (22:38 +0300)
Currently, the RewriteStatepointsForGC pass has a hardcoded list of GC
strategies that it operates on, forcing downstream projects to patch
LLVM to enable it for their own strategies. The diff D141110 changes
that to each GCStrategy having a flag to enable or disable RS4GC.

This patch adds that flag. It currently doesn't do anything, but is
provided so downstream projects can enable it to smooth the transition.

Reviewed By: dantrushin

Differential Revision: https://reviews.llvm.org/D142169

llvm/include/llvm/IR/GCStrategy.h
llvm/lib/IR/BuiltinGCs.cpp

index 05f5d82..9f3904f 100644 (file)
@@ -68,8 +68,13 @@ private:
 
 protected:
   bool UseStatepoints = false; /// Uses gc.statepoints as opposed to gc.roots,
-                               /// if set, none of the other options can be
-                               /// anything but their default values.
+                               /// if set, NeededSafePoints and UsesMetadata
+                               /// should be left at their default values.
+
+  bool UseRS4GC = false; /// If UseStatepoints is set, this determines whether
+                         /// the RewriteStatepointsForGC pass should rewrite
+                         /// this function's calls.
+                         /// This should only be set if UseStatepoints is set.
 
   bool NeededSafePoints = false;    ///< if set, calls are inferred to be safepoints
   bool UsesMetadata = false;     ///< If set, backend must emit metadata tables.
@@ -96,6 +101,15 @@ public:
   virtual std::optional<bool> isGCManagedPointer(const Type *Ty) const {
     return std::nullopt;
   }
+
+  /// Returns true if the RewriteStatepointsForGC pass should run on functions
+  /// using this GC.
+  bool useRS4GC() const {
+    assert(useStatepoints() &&
+           "GC strategy has useRS4GC but not useStatepoints set");
+    return UseRS4GC;
+  }
+
   ///@}
 
   /// If set, appropriate metadata tables must be emitted by the back-end
index 1a7100a..163b038 100644 (file)
@@ -66,6 +66,7 @@ class StatepointGC : public GCStrategy {
 public:
   StatepointGC() {
     UseStatepoints = true;
+    UseRS4GC = true;
     // These options are all gc.root specific, we specify them so that the
     // gc.root lowering code doesn't run.
     NeededSafePoints = false;
@@ -98,6 +99,7 @@ class CoreCLRGC : public GCStrategy {
 public:
   CoreCLRGC() {
     UseStatepoints = true;
+    UseRS4GC = true;
     // These options are all gc.root specific, we specify them so that the
     // gc.root lowering code doesn't run.
     NeededSafePoints = false;