[vmkit-commits] [vmkit] r197812 - rename gcrootpass into safepoint

Gael Thomas gael.thomas at lip6.fr
Fri Dec 20 06:01:59 PST 2013


Author: gthomas
Date: Fri Dec 20 08:01:59 2013
New Revision: 197812

URL: http://llvm.org/viewvc/llvm-project?rev=197812&view=rev
Log:
rename gcrootpass into safepoint

Added:
    vmkit/branches/mcjit/include/vmkit/safepoint.h
    vmkit/branches/mcjit/lib/vmkit/safpoint.cc
Removed:
    vmkit/branches/mcjit/lib/vmkit/gcrootpass.cc
Modified:
    vmkit/branches/mcjit/include/vmkit/vmkit.h
    vmkit/branches/mcjit/lib/vmkit/vmkit.cc

Added: vmkit/branches/mcjit/include/vmkit/safepoint.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/safepoint.h?rev=197812&view=auto
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/safepoint.h (added)
+++ vmkit/branches/mcjit/include/vmkit/safepoint.h Fri Dec 20 08:01:59 2013
@@ -0,0 +1,25 @@
+#ifndef _SAFEPOINT_H_
+#define _SAFEPOINT_H_
+
+#include <stdint.h>
+
+namespace vmkit {
+	class Safepoint { /* directly in the data sections */
+		void*    _addr;
+		void*    _metaData;
+		uint32_t _sourceIndex;
+		uint32_t _nbLives;
+		uint32_t _lives[2];
+
+	public:
+		void*    addr() { return _addr; }
+		void*    metaData() { return _metaData; }
+		void     updateMetaData(void* metaData) { _metaData = metaData; }
+		uint32_t nbLives() { return _nbLives; }
+		uint32_t liveAt(uint32_t i) { return _lives[i]; }
+
+		Safepoint* getNext();
+	};
+}
+
+#endif

Modified: vmkit/branches/mcjit/include/vmkit/vmkit.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/vmkit.h?rev=197812&r1=197811&r2=197812&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/vmkit.h (original)
+++ vmkit/branches/mcjit/include/vmkit/vmkit.h Fri Dec 20 08:01:59 2013
@@ -17,21 +17,7 @@ namespace llvm {
 
 namespace vmkit {
 	class Thread;
-
-	class Safepoint { /* managed with malloc/free */
-		const llvm::Function* _llvmFunction;
-		uintptr_t             _address;
-		size_t                _nbSlots;
-		uintptr_t             _offsets[1];
-
-		void* operator new(size_t unused, size_t nbSlots);
-		Safepoint(const llvm::Function* llvmFunction, uintptr_t address, size_t nbSlots);
-
-	public:
-		static Safepoint* create(const llvm::Function* llvmFunction, uintptr_t address, size_t nbSlots);
-
-		void setAt(size_t idx, uintptr_t offset)  { _offsets[idx] = idx; }
-	};
+	class Safepoint;
 
 	class ExceptionDescriptor { /* managed with malloc/free */
 		const llvm::Function* _llvmFunction;

Removed: vmkit/branches/mcjit/lib/vmkit/gcrootpass.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/gcrootpass.cc?rev=197811&view=auto
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/gcrootpass.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/gcrootpass.cc (removed)
@@ -1,135 +0,0 @@
-#include "llvm/IR/Function.h"
-#include "llvm/IR/Constants.h"
-#include "llvm/IR/Module.h"
-#include "llvm/IR/DataLayout.h"
-
-#include "llvm/CodeGen/GCs.h"
-#include "llvm/CodeGen/GCStrategy.h"
-#include "llvm/CodeGen/AsmPrinter.h"
-#include "llvm/CodeGen/GCMetadataPrinter.h"
-#include "llvm/CodeGen/MachineFunction.h"
-#include "llvm/CodeGen/MachineInstrBuilder.h"
-
-#include "llvm/MC/MCContext.h"
-#include "llvm/MC/MCAsmInfo.h"
-#include "llvm/MC/MCExpr.h"
-#include "llvm/MC/MCSymbol.h"
-#include "llvm/MC/MCStreamer.h"
-#include "llvm/MC/MCSection.h"
-
-#include "llvm/Support/Compiler.h"
-
-#include "llvm/Target/TargetInstrInfo.h"
-#include "llvm/Target/TargetMachine.h"
-#include "llvm/Target/Mangler.h"
-#include "llvm/Target/TargetLoweringObjectFile.h"
-
-using namespace llvm;
-
-namespace vmkit {
-	class VmkitGCPass : public GCStrategy {
-	public:
-    VmkitGCPass();
-    bool findCustomSafePoints(GCFunctionInfo& FI, MachineFunction &MF);
-  };
-
-  void linkVmkitGC() { }
-
-	static GCRegistry::Add<VmkitGCPass> X("vmkit", "VMKit GC for JIT-generated functions");
-
-	VmkitGCPass::VmkitGCPass() {
-		CustomSafePoints = true;
-		UsesMetadata = true;
-		InitRoots = 1;
-	}
-
-	static MCSymbol *InsertLabel(MachineBasicBlock &MBB, 
-															 MachineBasicBlock::iterator MI,
-															 DebugLoc DL) {
-		const TargetInstrInfo* TII = MBB.getParent()->getTarget().getInstrInfo();
-		MCSymbol *Label = MBB.getParent()->getContext().CreateTempSymbol();
-		BuildMI(MBB, MI, DL, TII->get(TargetOpcode::GC_LABEL)).addSym(Label);
-		return Label;
-	}
-
-	bool VmkitGCPass::findCustomSafePoints(GCFunctionInfo& FI, MachineFunction &MF) {
-		for (MachineFunction::iterator BBI = MF.begin(),
-					 BBE = MF.end(); BBI != BBE; ++BBI) {
-			for (MachineBasicBlock::iterator MI = BBI->begin(),
-						 ME = BBI->end(); MI != ME; ++MI) {
-				if (MI->getDesc().isCall()) {
-					MachineBasicBlock::iterator RAI = MI; ++RAI;                                
-					MCSymbol* Label = InsertLabel(*MI->getParent(), RAI, MI->getDebugLoc());
-					FI.addSafePoint(GC::PostCall, Label, MI->getDebugLoc());
-				} else if (MI->getDebugLoc().getCol() == 1) {
-					MCSymbol* Label = InsertLabel(*MI->getParent(), MI, MI->getDebugLoc());
-					FI.addSafePoint(GC::Loop, Label, MI->getDebugLoc());
-				}
-			}
-		}
-
-		return false;
-	}
-
-  class VmkitGCMetadataPrinter : public GCMetadataPrinter {
-  public:
-    void beginAssembly(AsmPrinter &AP);
-    void finishAssembly(AsmPrinter &AP);
-  };
-
-	static GCMetadataPrinterRegistry::Add<VmkitGCMetadataPrinter>
-	Y("vmkit", "VMKit garbage-collector");
-	
-	void VmkitGCMetadataPrinter::beginAssembly(AsmPrinter &AP) {}
-
-	void VmkitGCMetadataPrinter::finishAssembly(AsmPrinter &AP) {
-		AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getDataSection());
-
-		unsigned IntPtrSize = AP.TM.getDataLayout()->getPointerSize(0);
-		
-		SmallString<256> symName("_");
-		symName += getModule().getModuleIdentifier();
-		symName += "__frametable";
-
-		MCSymbol *sym = AP.OutContext.GetOrCreateSymbol(symName);
-		AP.OutStreamer.EmitSymbolAttribute(sym, MCSA_Global);
-
-		AP.EmitAlignment(IntPtrSize == 4 ? 2 : 3);
-
-    AP.OutStreamer.AddComment("--- module frame tables ---");
-    AP.OutStreamer.AddBlankLine();
-		AP.OutStreamer.EmitLabel(sym);		
-
-		for (iterator I = begin(), IE = end(); I != IE; ++I) {
-			GCFunctionInfo* gcInfo = *I;
-			
-			if(gcInfo->getFunction().hasGC()) {
-				AP.OutStreamer.AddComment("live roots for " + Twine(gcInfo->getFunction().getName()));
-				AP.OutStreamer.AddBlankLine();
-				for(llvm::GCFunctionInfo::iterator safepoint=gcInfo->begin(); safepoint!=gcInfo->end(); safepoint++) {
-					DebugLoc* debug = &safepoint->Loc;
-					uint32_t  kind = safepoint->Kind;
-
-					const MCExpr* address = MCSymbolRefExpr::Create(safepoint->Label, AP.OutStreamer.getContext());
-					if (debug->getCol() == 1) {
-						const MCExpr* one = MCConstantExpr::Create(1, AP.OutStreamer.getContext());
-						address = MCBinaryExpr::CreateAdd(address, one, AP.OutStreamer.getContext());
-					}
-
-					AP.OutStreamer.EmitValue(address, IntPtrSize);
-					AP.EmitGlobalConstant(&gcInfo->getFunction());
-					AP.EmitInt32(debug->getLine());
-					AP.EmitInt32(gcInfo->live_size(safepoint));
-
-					//fprintf(stderr, "emitting %lu lives\n", gcInfo->live_size(safepoint));
-					for(GCFunctionInfo::live_iterator live=gcInfo->live_begin(safepoint); live!=gcInfo->live_end(safepoint); live++) {
-						AP.EmitInt32(live->StackOffset);
-					}
-					AP.EmitAlignment(IntPtrSize == 4 ? 2 : 3);
-				}
-			}
-		}
-
-		AP.OutStreamer.EmitValue(MCConstantExpr::Create(0, AP.OutStreamer.getContext()), IntPtrSize);
-	}
-}

Added: vmkit/branches/mcjit/lib/vmkit/safpoint.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/safpoint.cc?rev=197812&view=auto
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/safpoint.cc (added)
+++ vmkit/branches/mcjit/lib/vmkit/safpoint.cc Fri Dec 20 08:01:59 2013
@@ -0,0 +1,149 @@
+#include "vmkit/safepoint.h"
+
+#include "llvm/IR/Function.h"
+#include "llvm/IR/Constants.h"
+#include "llvm/IR/Module.h"
+#include "llvm/IR/DataLayout.h"
+
+#include "llvm/CodeGen/GCs.h"
+#include "llvm/CodeGen/GCStrategy.h"
+#include "llvm/CodeGen/AsmPrinter.h"
+#include "llvm/CodeGen/GCMetadataPrinter.h"
+#include "llvm/CodeGen/MachineFunction.h"
+#include "llvm/CodeGen/MachineInstrBuilder.h"
+
+#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCAsmInfo.h"
+#include "llvm/MC/MCExpr.h"
+#include "llvm/MC/MCSymbol.h"
+#include "llvm/MC/MCStreamer.h"
+#include "llvm/MC/MCSection.h"
+
+#include "llvm/Support/Compiler.h"
+
+#include "llvm/Target/TargetInstrInfo.h"
+#include "llvm/Target/TargetMachine.h"
+#include "llvm/Target/Mangler.h"
+#include "llvm/Target/TargetLoweringObjectFile.h"
+
+namespace vmkit {
+	class VmkitGCPass : public llvm::GCStrategy {
+	public:
+		static llvm::MCSymbol *InsertLabel(llvm::MachineBasicBlock &MBB, 
+																			 llvm::MachineBasicBlock::iterator MI,
+																			 llvm::DebugLoc DL);
+
+    VmkitGCPass();
+    bool findCustomSafePoints(llvm::GCFunctionInfo& FI, llvm::MachineFunction &MF);
+  };
+
+  class VmkitGCMetadataPrinter : public llvm::GCMetadataPrinter {
+  public:
+    void beginAssembly(llvm::AsmPrinter &AP) {}
+    void finishAssembly(llvm::AsmPrinter &AP);
+  };
+}
+
+using namespace vmkit;
+
+static llvm::GCRegistry::Add<VmkitGCPass> X("vmkit", "VMKit GC for JIT-generated functions");
+static llvm::GCMetadataPrinterRegistry::Add<VmkitGCMetadataPrinter> Y("vmkit", "VMKit garbage-collector");
+
+/*
+ *    VmkitGCPass
+ */
+VmkitGCPass::VmkitGCPass() {
+	CustomSafePoints = true;
+	UsesMetadata = true;
+	InitRoots = 1;
+}
+
+llvm::MCSymbol *VmkitGCPass::InsertLabel(llvm::MachineBasicBlock &MBB, 
+																	 llvm::MachineBasicBlock::iterator MI,
+																	 llvm::DebugLoc DL) {
+	const llvm::TargetInstrInfo* TII = MBB.getParent()->getTarget().getInstrInfo();
+	llvm::MCSymbol *Label = MBB.getParent()->getContext().CreateTempSymbol();
+	BuildMI(MBB, MI, DL, TII->get(llvm::TargetOpcode::GC_LABEL)).addSym(Label);
+	return Label;
+}
+
+bool VmkitGCPass::findCustomSafePoints(llvm::GCFunctionInfo& FI, llvm::MachineFunction &MF) {
+	for (llvm::MachineFunction::iterator BBI = MF.begin(),
+				 BBE = MF.end(); BBI != BBE; ++BBI) {
+		for (llvm::MachineBasicBlock::iterator MI = BBI->begin(),
+					 ME = BBI->end(); MI != ME; ++MI) {
+			if (MI->getDesc().isCall()) {
+				llvm::MachineBasicBlock::iterator RAI = MI; ++RAI;                                
+				llvm::MCSymbol* Label = InsertLabel(*MI->getParent(), RAI, MI->getDebugLoc());
+				FI.addSafePoint(llvm::GC::PostCall, Label, MI->getDebugLoc());
+			} else if (MI->getDebugLoc().getCol() == 1) {
+				llvm::MCSymbol* Label = InsertLabel(*MI->getParent(), MI, MI->getDebugLoc());
+				FI.addSafePoint(llvm::GC::Loop, Label, MI->getDebugLoc());
+			}
+		}
+	}
+
+	return false;
+}
+
+/*
+ *    VmkitGCMetadataPrinter
+ */
+void VmkitGCMetadataPrinter::finishAssembly(llvm::AsmPrinter &AP) {
+	AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getDataSection());
+
+	unsigned IntPtrSize = AP.TM.getDataLayout()->getPointerSize(0);
+		
+	llvm::SmallString<256> symName("_");
+	symName += getModule().getModuleIdentifier();
+	symName += "__frametable";
+
+	llvm::MCSymbol *sym = AP.OutContext.GetOrCreateSymbol(symName);
+	AP.OutStreamer.EmitSymbolAttribute(sym, llvm::MCSA_Global);
+
+	AP.EmitAlignment(IntPtrSize == 4 ? 2 : 3);
+
+	AP.OutStreamer.AddComment("--- module frame tables ---");
+	AP.OutStreamer.AddBlankLine();
+	AP.OutStreamer.EmitLabel(sym);		
+
+	for (iterator I = begin(), IE = end(); I != IE; ++I) {
+		llvm::GCFunctionInfo* gcInfo = *I;
+			
+		if(gcInfo->getFunction().hasGC()) {
+			AP.OutStreamer.AddComment("live roots for " + llvm::Twine(gcInfo->getFunction().getName()));
+			AP.OutStreamer.AddBlankLine();
+			for(llvm::GCFunctionInfo::iterator safepoint=gcInfo->begin(); safepoint!=gcInfo->end(); safepoint++) {
+				llvm::DebugLoc* debug = &safepoint->Loc;
+				uint32_t  kind = safepoint->Kind;
+
+				const llvm::MCExpr* address = llvm::MCSymbolRefExpr::Create(safepoint->Label, AP.OutStreamer.getContext());
+				if (debug->getCol() == 1) {
+					const llvm::MCExpr* one = llvm::MCConstantExpr::Create(1, AP.OutStreamer.getContext());
+					address = llvm::MCBinaryExpr::CreateAdd(address, one, AP.OutStreamer.getContext());
+				}
+
+				AP.OutStreamer.EmitValue(address, IntPtrSize);
+				AP.EmitGlobalConstant(&gcInfo->getFunction());
+				AP.EmitInt32(debug->getLine());
+				AP.EmitInt32(gcInfo->live_size(safepoint));
+
+				//fprintf(stderr, "emitting %lu lives\n", gcInfo->live_size(safepoint));
+				for(llvm::GCFunctionInfo::live_iterator live=gcInfo->live_begin(safepoint); live!=gcInfo->live_end(safepoint); live++) {
+					AP.EmitInt32(live->StackOffset);
+				}
+				AP.EmitAlignment(IntPtrSize == 4 ? 2 : 3);
+			}
+		}
+	}
+
+	AP.OutStreamer.EmitValue(llvm::MCConstantExpr::Create(0, AP.OutStreamer.getContext()), IntPtrSize);
+}
+
+/* 
+ *    Safepoint
+ */
+Safepoint* Safepoint::getNext() {
+	uintptr_t next = (uintptr_t)this + sizeof(Safepoint) - 2*sizeof(uint32_t) + nbLives()*sizeof(uint32_t);
+	return (Safepoint*)(((next - 1) & -sizeof(uintptr_t)) + sizeof(uintptr_t));
+}

Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=197812&r1=197811&r2=197812&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Fri Dec 20 08:01:59 2013
@@ -209,20 +209,6 @@ void VMKit::throwException(void* obj) {
 }
 
 
-void* Safepoint::operator new(size_t unused, size_t nbSlots) {
-	return ::operator new(sizeof(Safepoint) + nbSlots*sizeof(uintptr_t) - sizeof(uintptr_t));
-}
-
-Safepoint::Safepoint(const llvm::Function* llvmFunction, uintptr_t address, size_t nbSlots) {
-	_llvmFunction = llvmFunction;
-	_address = address;
-	_nbSlots = nbSlots;
-}
-
-Safepoint* Safepoint::create(const llvm::Function* llvmFunction, uintptr_t address, size_t nbSlots) {
-	return new(nbSlots) Safepoint(llvmFunction, address, nbSlots);
-}
-
 ExceptionDescriptor::ExceptionDescriptor(const llvm::Function* llvmFunction, uintptr_t point, uintptr_t landingPad) {
 	_llvmFunction = llvmFunction;
 	_point = point;





More information about the vmkit-commits mailing list