[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