[LLVMdev] getting started with IR needing GC

Gordon Henriksen gordonhenriksen at mac.com
Tue Apr 29 09:43:35 PDT 2008


On 2008-04-29, at 01:51, Jonathan S. Shapiro wrote:

> Gordon: assume, for a moment, that I'm willing to go the extra  
> several miles to do this type if thing in my GC implementation. How  
> might I go about getting per-call-site register typings, register  
> save locations, and return-pc information extracted for use by this  
> hypothetical sophisticated walker?

There are two complementary interfaces here, which mesh neatly into  
the existing collection of GC algorithms exposed by Collector.

The first is liveness analysis, for stack roots as well as register  
maps. The Collector API is set up for this, although it is not yet  
implemented.

The second is register maps (which of course are necessarily liveness  
accurate). The Collector API is not presently set up for this, but I  
expect the API additions would be rather simple:

  MyCollector() {
+  // Please don't spill roots to stack slots at safe points.
+  RegisterRoots = true;
  }

  void MyCollector::finishAssembly(std::ostream &OS, AsmPrinter &AP,
                                   const TargetAsmInfo &TAI) {
    // Iterate functions.
    for (iterator I = begin(), E = end(); I != E; ++I) {
      // Iterate safe points.
      for (CollectorMetadata::iterator PI = MD.begin(),
                                       PE = MD.end(); PI != PE; ++PI) {
        // Live stack roots.
        for (CollectorMetadata::live_iterator LI = MD.live_begin(PI),
                                              LE = MD.live_end(PI);
                                              LI != LE; ++LI) {
          // Print its offset within the stack frame.
          AP.EmitInt32(LI->StackOffset);
          AP.EOL("stack offset");
        }
+      for (CollectorMetadata::reg_iterator RI = MD.reg_begin(PI),
+                                           RE = MD.reg_end(PI);
+                                           RI != RE; ++RI) {
+        int TargetRegNum = RI->Register;
+        Constant *RootMetadata = RI->Metadata;
+      }
    }
  }

Both of these require a more sophisticated SelectionDAG representation  
of GC pointers. I'm still mulling this representation over, but I  
think the derived pointer problem could be solved simultaneously.

That done, I think liveness w/ register roots would be the first  
feature to be enabled.

Next, liveness w/o register roots. (This is simply liveness with  
register roots, where each root is forcibly spilled.)

— Gordon

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20080429/bbe81426/attachment.html>


More information about the llvm-dev mailing list