[vmkit-commits] [vmkit] r200651 - Rename safepoint.cc
Gael Thomas
gael.thomas at lip6.fr
Sun Feb 2 12:46:58 PST 2014
Author: gthomas
Date: Sun Feb 2 14:46:58 2014
New Revision: 200651
URL: http://llvm.org/viewvc/llvm-project?rev=200651&view=rev
Log:
Rename safepoint.cc
Added:
vmkit/branches/mcjit/lib/vmkit/safepoint.cc
- copied unchanged from r200650, vmkit/branches/mcjit/lib/vmkit/safpoint.cc
Removed:
vmkit/branches/mcjit/lib/vmkit/safpoint.cc
Removed: vmkit/branches/mcjit/lib/vmkit/safpoint.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/safpoint.cc?rev=200650&view=auto
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/safpoint.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/safpoint.cc (removed)
@@ -1,222 +0,0 @@
-#include "vmkit/safepoint.h"
-#include "vmkit/compiler.h"
-#include "vmkit/system.h"
-
-#include "llvm/DebugInfo.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"
-
-#include "llvm/ExecutionEngine/ExecutionEngine.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) {
- unsigned IntPtrSize = AP.TM.getDataLayout()->getPointerSize(0);
- uint32_t i = 0;
-
- AP.OutStreamer.AddComment("--- function names for the frame tables ---");
- AP.OutStreamer.AddBlankLine();
- AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getSectionForConstant(llvm::SectionKind::getMergeable1ByteCString()));
- for (iterator I = begin(), IE = end(); I != IE; ++I, i++) {
- llvm::GCFunctionInfo* gcInfo = *I;
- if(gcInfo->getFunction().hasGC()) {
- llvm::SmallString<256> id("gcFunc");
- id += i;
-
- llvm::MCSymbol *sym = AP.OutContext.GetOrCreateSymbol(id);
- AP.OutStreamer.EmitLabel(sym);
-
- llvm::StringRef ref = gcInfo->getFunction().getName();
- uint32_t len = ref.size();
- for(uint32_t n=0; n<len; n++)
- AP.EmitInt8(ref.data()[n]);
- AP.EmitInt8(0);
- }
- }
-
- AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getDataSection());
-
- 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("--- frame tables ---");
- AP.OutStreamer.AddBlankLine();
- AP.OutStreamer.EmitLabel(sym);
-
- i = 0;
- for (iterator I = begin(), IE = end(); I != IE; ++I, i++) {
- llvm::GCFunctionInfo* gcInfo = *I;
-
- if(gcInfo->getFunction().hasGC()) {
- AP.OutStreamer.AddComment("live roots for " + llvm::Twine(gcInfo->getFunction().getName()));
- AP.OutStreamer.AddBlankLine();
-
- llvm::SmallString<256> id("gcFunc");
- id += i;
-
- const llvm::MCExpr* funcName = llvm::MCSymbolRefExpr::Create(AP.OutContext.GetOrCreateSymbol(id), AP.OutStreamer.getContext());
-
- for(llvm::GCFunctionInfo::iterator safepoint=gcInfo->begin(); safepoint!=gcInfo->end(); safepoint++) {
- llvm::DebugLoc* debug = &safepoint->Loc;
- llvm::MDNode* inlinedAt = debug->getInlinedAt(getModule().getContext());
-
- if(inlinedAt) {
- fprintf(stderr, "find inline location in %s\n", gcInfo->getFunction().getName().data());
- llvm::DISubprogram sub(debug->getScope(getModule().getContext()));
- fprintf(stderr, "Inlined: %s::%d\n", sub.getName().data(), debug->getLine());
- llvm::DILocation cur(inlinedAt);
- while(cur.getScope()) {
- llvm::DISubprogram il(cur.getScope());
- fprintf(stderr, " => %s::%d\n", il.getName().data(), cur.getLineNumber());
- cur = cur.getOrigLocation();
- };
-
- llvm::DILocation loc(inlinedAt);
- llvm::DISubprogram il(loc.getScope());
-
-
- if(strcmp(gcInfo->getFunction().getName().data(), il.getName().data()))
- abort();
- }
-
- 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.OutStreamer.EmitValue(funcName, IntPtrSize);
- // AP.EmitGlobalConstant(&gcInfo->getFunction());
- AP.EmitInt32(0);
- if(IntPtrSize == 8)
- AP.EmitInt32(0);
- 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) + nbLives()*sizeof(uint32_t);
- return (Safepoint*)(((next - 1) & -sizeof(uintptr_t)) + sizeof(uintptr_t));
-}
-
-Safepoint* Safepoint::get(CompilationUnit* unit, llvm::Module* module) {
- std::string symName;
- symName += '_';
- symName += module->getModuleIdentifier();
- symName += "__frametable";
- return (vmkit::Safepoint*)unit->ee()->getGlobalValueAddress(System::mcjitSymbol(symName.c_str()));
-}
-
-void Safepoint::dump() {
- fprintf(stderr, " [%p] safepoint at %p for %s::%d\n", this, addr(), functionName(), sourceIndex());
- for(uint32_t i=0; i<nbLives(); i++)
- fprintf(stderr, " live at %d\n", liveAt(i));
-}
More information about the vmkit-commits
mailing list