From gael.thomas at lip6.fr Sun Feb 2 12:46:17 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 02 Feb 2014 20:46:17 -0000 Subject: [vmkit-commits] [vmkit] r200650 - I think that I have found a way to rebuild a virtual stack of inlined functions. This commit just adds few code able to rebuild this stack in the safepoint generator. Message-ID: <20140202204617.4FFDB2A6C049@llvm.org> Author: gthomas Date: Sun Feb 2 14:46:16 2014 New Revision: 200650 URL: http://llvm.org/viewvc/llvm-project?rev=200650&view=rev Log: I think that I have found a way to rebuild a virtual stack of inlined functions. This commit just adds few code able to rebuild this stack in the safepoint generator. Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/vmkit/safpoint.cc vmkit/branches/mcjit/lib/vmkit/vmkit.cc Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=200650&r1=200649&r2=200650&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sun Feb 2 14:46:16 2014 @@ -47,11 +47,16 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato #if 0 /* usefull to debug a single function */ - if( cl->name() == vm->names()->get("sun/util/calendar/BaseCalendar") && - method->name() == vm->names()->get("getFixedDate") && + if( cl->name() == vm->names()->get("java.lang.Class") && + method->name() == vm->names()->get("asSubclass") && method->signature()->name() == vm->names()->get("(IIILsun/util/calendar/BaseCalendar$Date;)J") ) { - + vm->options()->genDebugExecute = 2; vm->options()->debugTranslate = 3; + vm->options()->debugExecute = 5; + } else { + vm->options()->genDebugExecute = 0; + vm->options()->debugTranslate = 0; + //vm->options()->debugExecute = 0; } #endif @@ -132,6 +137,9 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato signature->setCaller(access, (J3Signature::function_t)loader->ee()->getFunctionAddress("generic-caller")); method->markCompiled(llvmFunction, fnPtr); + + if(vm->options()->debugTranslate > 2) + llvmFunction->dump(); } J3CodeGen::~J3CodeGen() { @@ -406,7 +414,7 @@ void J3CodeGen::invoke(uint32_t access, stack.drop(n); - llvm::Value* res; + llvm::Instruction* res; if(exceptions.nodes[curExceptionNode]->landingPad) { //llvm::BasicBlock* after = forwardBranch("invoke-after", codeReader->tell(), 0, 0); @@ -416,6 +424,8 @@ void J3CodeGen::invoke(uint32_t access, } else { res = builder.CreateCall(func, args); } + + res->setDebugLoc(llvm::DebugLoc::get(javaPC, 0, dbgInfo)); if(!res->getType()->isVoidTy()) stack.push(flatten(res)); @@ -1700,7 +1710,7 @@ void J3CodeGen::generateJava() { llvm::DIBuilder* dbgBuilder = new llvm::DIBuilder(*module); - dbgInfo = + dbgInfo = dbgBuilder->createFunction(llvm::DIDescriptor(), // Function scope llvmFunction->getName(), // Function name llvmFunction->getName(), // Mangled name @@ -1712,7 +1722,10 @@ void J3CodeGen::generateJava() { // This includes return type at 0th index. false, // True if this function is not externally visible false, // True if this is a function definition - 0 // Set to the beginning of the scope this starts + 0, // Set to the beginning of the scope this starts + 0, + false, + llvmFunction ); uint32_t maxStack = reader.readU2(); Modified: vmkit/branches/mcjit/lib/vmkit/safpoint.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/safpoint.cc?rev=200650&r1=200649&r2=200650&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/safpoint.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/safpoint.cc Sun Feb 2 14:46:16 2014 @@ -2,6 +2,8 @@ #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" @@ -147,6 +149,27 @@ void VmkitGCMetadataPrinter::finishAssem 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()); Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=200650&r1=200649&r2=200650&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Sun Feb 2 14:46:16 2014 @@ -190,9 +190,10 @@ void VMKit::sigend() { } void VMKit::throwException(void* obj) { - //internalError("throw exception...\n"); - //fprintf(stderr, "throw %p\n", obj); - //Thread::get()->vm()->printStackTrace(); + // internalError("throw exception...\n"); + // fprintf(stderr, "throw %p\n", obj); + // Thread::get()->vm()->printStackTrace(); + // abort(); throw obj; } From gael.thomas at lip6.fr Sun Feb 2 12:46:58 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 02 Feb 2014 20:46:58 -0000 Subject: [vmkit-commits] [vmkit] r200651 - Rename safepoint.cc Message-ID: <20140202204658.AD0AE2A6C049@llvm.org> 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 X("vmkit", "VMKit GC for JIT-generated functions"); -static llvm::GCMetadataPrinterRegistry::Add 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 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 Author: gthomas Date: Sun Feb 2 15:04:23 2014 New Revision: 200653 URL: http://llvm.org/viewvc/llvm-project?rev=200653&view=rev Log: A function to emit function names (char*) Modified: vmkit/branches/mcjit/include/vmkit/safepoint.h vmkit/branches/mcjit/lib/vmkit/compiler.cc vmkit/branches/mcjit/lib/vmkit/safepoint.cc Modified: vmkit/branches/mcjit/include/vmkit/safepoint.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/safepoint.h?rev=200653&r1=200652&r2=200653&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/safepoint.h (original) +++ vmkit/branches/mcjit/include/vmkit/safepoint.h Sun Feb 2 15:04:23 2014 @@ -10,7 +10,7 @@ namespace llvm { namespace vmkit { class CompilationUnit; - class Safepoint { /* directly in the data sections */ + class Safepoint { /* Warning: directly generated by safepoint.cc in the data sections */ void* _addr; const char* _functionName; CompilationUnit* _unit; Modified: vmkit/branches/mcjit/lib/vmkit/compiler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/compiler.cc?rev=200653&r1=200652&r2=200653&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/compiler.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/compiler.cc Sun Feb 2 15:04:23 2014 @@ -187,7 +187,7 @@ void CompilationUnit::compileModule(llvm sf->setUnit(this); vm->addSafepoint(sf); - //vm()->getSafepoint(sf->addr())->dump(); + Thread::get()->vm()->getSafepoint(sf->addr())->dump(); sf = sf->getNext(); } } Modified: vmkit/branches/mcjit/lib/vmkit/safepoint.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/safepoint.cc?rev=200653&r1=200652&r2=200653&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/safepoint.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/safepoint.cc Sun Feb 2 15:04:23 2014 @@ -44,6 +44,7 @@ namespace vmkit { }; class VmkitGCMetadataPrinter : public llvm::GCMetadataPrinter { + const llvm::MCExpr* emitName(llvm::AsmPrinter &AP, llvm::StringRef str, unsigned int* num); public: void beginAssembly(llvm::AsmPrinter &AP) {} void finishAssembly(llvm::AsmPrinter &AP); @@ -92,33 +93,31 @@ bool VmkitGCPass::findCustomSafePoints(l return false; } +const llvm::MCExpr* VmkitGCMetadataPrinter::emitName(llvm::AsmPrinter &AP, llvm::StringRef str, unsigned int* num) { + AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getSectionForConstant(llvm::SectionKind::getMergeable1ByteCString())); + llvm::SmallString<256> id("gcFunc"); + id += (*num)++; + + llvm::MCSymbol *sym = AP.OutContext.GetOrCreateSymbol(id); + AP.OutStreamer.EmitLabel(sym); + + uint32_t len = str.size(); + for(uint32_t n=0; ngetPointerSize(0); - uint32_t i = 0; + uint32_t funcNumber = 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 symName("_"); @@ -134,18 +133,11 @@ void VmkitGCMetadataPrinter::finishAssem AP.OutStreamer.AddBlankLine(); AP.OutStreamer.EmitLabel(sym); - i = 0; - for (iterator I = begin(), IE = end(); I != IE; ++I, i++) { + 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(); - - llvm::SmallString<256> id("gcFunc"); - id += i; - - const llvm::MCExpr* funcName = llvm::MCSymbolRefExpr::Create(AP.OutContext.GetOrCreateSymbol(id), AP.OutStreamer.getContext()); + const llvm::MCExpr* funcName = emitName(AP, gcInfo->getFunction().getName(), &funcNumber); for(llvm::GCFunctionInfo::iterator safepoint=gcInfo->begin(); safepoint!=gcInfo->end(); safepoint++) { llvm::DebugLoc* debug = &safepoint->Loc; @@ -164,7 +156,6 @@ void VmkitGCMetadataPrinter::finishAssem llvm::DILocation loc(inlinedAt); llvm::DISubprogram il(loc.getScope()); - if(strcmp(gcInfo->getFunction().getName().data(), il.getName().data())) abort(); From gael.thomas at lip6.fr Sun Feb 2 13:58:26 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 02 Feb 2014 21:58:26 -0000 Subject: [vmkit-commits] [vmkit] r200657 - Store inline information in safepoints. Message-ID: <20140202215827.085152A6C049@llvm.org> Author: gthomas Date: Sun Feb 2 15:58:26 2014 New Revision: 200657 URL: http://llvm.org/viewvc/llvm-project?rev=200657&view=rev Log: Store inline information in safepoints. Modified: vmkit/branches/mcjit/include/vmkit/safepoint.h vmkit/branches/mcjit/lib/vmkit/compiler.cc vmkit/branches/mcjit/lib/vmkit/safepoint.cc Modified: vmkit/branches/mcjit/include/vmkit/safepoint.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/safepoint.h?rev=200657&r1=200656&r2=200657&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/safepoint.h (original) +++ vmkit/branches/mcjit/include/vmkit/safepoint.h Sun Feb 2 15:58:26 2014 @@ -2,6 +2,7 @@ #define _SAFEPOINT_H_ #include +#include namespace llvm { class Module; @@ -12,20 +13,31 @@ namespace vmkit { class Safepoint { /* Warning: directly generated by safepoint.cc in the data sections */ void* _addr; - const char* _functionName; CompilationUnit* _unit; - uint32_t _sourceIndex; + uint32_t _nbLives; + uint32_t _inlineDepth; public: void setUnit(CompilationUnit* unit) { _unit = unit; } CompilationUnit* unit() { return _unit; } void* addr() { return _addr; } - const char* functionName() { return _functionName; } - uint32_t sourceIndex() { return _sourceIndex; } uint32_t nbLives() { return _nbLives; } - uint32_t liveAt(uint32_t i) { return ((uint32_t*)(this + 1))[i]; } + uint32_t inlineDepth() { return _inlineDepth; } + + uint32_t liveAt(uint32_t i) { + return ((uint32_t*)(this + 1))[i]; + } + + const char* functionName(uint32_t i=0) { + return *(char**)((uintptr_t)this + sizeof(Safepoint) + _nbLives*sizeof(uint32_t) + i*(sizeof(const char*)+sizeof(uint32_t))); + } + + uint32_t sourceIndex(uint32_t i=0) { + return *(uint32_t*)((uintptr_t)this + sizeof(Safepoint) + _nbLives*sizeof(uint32_t) + + sizeof(const char*) + i*(sizeof(const char*)+sizeof(uint32_t))); + } Safepoint* getNext(); void dump(); Modified: vmkit/branches/mcjit/lib/vmkit/compiler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/compiler.cc?rev=200657&r1=200656&r2=200657&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/compiler.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/compiler.cc Sun Feb 2 15:58:26 2014 @@ -187,7 +187,7 @@ void CompilationUnit::compileModule(llvm sf->setUnit(this); vm->addSafepoint(sf); - Thread::get()->vm()->getSafepoint(sf->addr())->dump(); + //Thread::get()->vm()->getSafepoint(sf->addr())->dump(); sf = sf->getNext(); } } Modified: vmkit/branches/mcjit/lib/vmkit/safepoint.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/safepoint.cc?rev=200657&r1=200656&r2=200657&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/safepoint.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/safepoint.cc Sun Feb 2 15:58:26 2014 @@ -141,47 +141,72 @@ void VmkitGCMetadataPrinter::finishAssem 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()); + } + llvm::MDNode* inlinedAt = debug->getInlinedAt(getModule().getContext()); + uint32_t inlineDepth = 1; + 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()); + inlineDepth++; 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()); + /* CompilationUnit* */ AP.EmitInt32(0); if(IntPtrSize == 8) AP.EmitInt32(0); - AP.EmitInt32(debug->getLine()); + + /* number of live roots */ AP.EmitInt32(gcInfo->live_size(safepoint)); + /* inline stack depth */ + AP.EmitInt32(inlineDepth); //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++) { + for(llvm::GCFunctionInfo::live_iterator live=gcInfo->live_begin(safepoint); live!=gcInfo->live_end(safepoint); live++) AP.EmitInt32(live->StackOffset); + + /* function names stack */ + if(inlinedAt) { + //fprintf(stderr, "find inline location in %s: %d\n", gcInfo->getFunction().getName().data(), inlineDepth); + llvm::DISubprogram sub(debug->getScope(getModule().getContext())); + + //fprintf(stderr, "Inlined: %s::%d\n", sub.getName().data(), debug->getLine()); + AP.OutStreamer.EmitValue(emitName(AP, sub.getName().data(), &funcNumber), IntPtrSize); + AP.EmitInt32(debug->getLine()); + + llvm::DILocation cur(inlinedAt); + while(cur.getScope()) { + llvm::DISubprogram il(cur.getScope()); + //fprintf(stderr, " => %s::%d\n", il.getName().data(), cur.getLineNumber()); + if(strcmp(il.getName().data(), gcInfo->getFunction().getName().data())) + AP.OutStreamer.EmitValue(emitName(AP, il.getName().data(), &funcNumber), IntPtrSize); + else + AP.OutStreamer.EmitValue(funcName, IntPtrSize); + AP.EmitInt32(cur.getLineNumber()); + cur = cur.getOrigLocation(); + }; + + llvm::DILocation loc(inlinedAt); + llvm::DISubprogram il(loc.getScope()); + + //if(strcmp(gcInfo->getFunction().getName().data(), il.getName().data())) + //abort(); + } else { + AP.OutStreamer.EmitValue(funcName, IntPtrSize); + AP.EmitInt32(debug->getLine()); } + AP.EmitAlignment(IntPtrSize == 4 ? 2 : 3); } } @@ -194,7 +219,8 @@ void VmkitGCMetadataPrinter::finishAssem * Safepoint */ Safepoint* Safepoint::getNext() { - uintptr_t next = (uintptr_t)this + sizeof(Safepoint) + nbLives()*sizeof(uint32_t); + uintptr_t next = (uintptr_t)this + sizeof(Safepoint) + nbLives()*sizeof(uint32_t) + + inlineDepth()*(sizeof(const char*)+sizeof(uint32_t)); return (Safepoint*)(((next - 1) & -sizeof(uintptr_t)) + sizeof(uintptr_t)); } @@ -208,6 +234,12 @@ Safepoint* Safepoint::get(CompilationUni void Safepoint::dump() { fprintf(stderr, " [%p] safepoint at %p for %s::%d\n", this, addr(), functionName(), sourceIndex()); + + for(uint32_t i=1; i Author: gthomas Date: Sun Feb 2 16:26:13 2014 New Revision: 200658 URL: http://llvm.org/viewvc/llvm-project?rev=200658&view=rev Log: getJavaCaller takes into account inlining. Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3thread.cc Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc?rev=200658&r1=200657&r2=200658&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Feb 2 16:26:13 2014 @@ -636,20 +636,7 @@ jclass JNICALL JVM_GetCallerClass(JNIEnv if(depth != -1) J3::internalError("depth should be -1 while it is %d", depth); - depth = 3; - J3Method* caller = 0; - J3* vm = J3Thread::get()->vm(); - vmkit::Safepoint* sf = 0; - vmkit::StackWalker walker; - - while(!caller && walker.next()) { - vmkit::Safepoint* sf = vm->getSafepoint(walker.ip()); - - if(sf) { - if(!--depth) - caller = (J3Method*)sf->unit()->getSymbol(sf->functionName()); - } - } + J3Method* caller = J3Thread::get()->getJavaCaller(2); if(!caller) J3::internalError("unable to find caller class, what should I do?"); Modified: vmkit/branches/mcjit/lib/j3/vm/j3thread.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3thread.cc?rev=200658&r1=200657&r2=200658&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3thread.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3thread.cc Sun Feb 2 16:26:13 2014 @@ -39,8 +39,12 @@ J3Method* J3Thread::getJavaCaller(uint32 while(walker.next()) { vmkit::Safepoint* sf = vm()->getSafepoint(walker.ip()); - if(sf && !level--) - return (J3Method*)sf->unit()->getSymbol(sf->functionName()); + if(sf) { + if(level < sf->inlineDepth()) + return (J3Method*)sf->unit()->getSymbol(sf->functionName(level)); + else + level -= sf->inlineDepth(); + } } return 0; From gael.thomas at lip6.fr Sun Feb 2 14:36:23 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 02 Feb 2014 22:36:23 -0000 Subject: [vmkit-commits] [vmkit] r200660 - Native printStackTrace (if a problem occurs during bootstrap) also takes into account inlining. Message-ID: <20140202223623.26CCF2A6C04A@llvm.org> Author: gthomas Date: Sun Feb 2 16:36:22 2014 New Revision: 200660 URL: http://llvm.org/viewvc/llvm-project?rev=200660&view=rev Log: Native printStackTrace (if a problem occurs during bootstrap) also takes into account inlining. Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3.cc?rev=200660&r1=200659&r2=200660&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Feb 2 16:36:22 2014 @@ -438,9 +438,11 @@ void J3::printStackTrace() { vmkit::Safepoint* sf = J3Thread::get()->vm()->getSafepoint(walker.ip()); if(sf) { - J3Method* m = (J3Method*)sf->unit()->getSymbol(sf->functionName()); - fprintf(stderr, " in %s::%s%s index %d\n", m->cl()->name()->cStr(), m->name()->cStr(), - m->signature()->name()->cStr(), sf->sourceIndex()); + for(uint32_t i=0; iinlineDepth(); i++) { + J3Method* m = (J3Method*)sf->unit()->getSymbol(sf->functionName(i)); + fprintf(stderr, " in %s::%s%s index %d\n", m->cl()->name()->cStr(), m->name()->cStr(), + m->signature()->name()->cStr(), sf->sourceIndex()); + } } else { Dl_info info; From gael.thomas at lip6.fr Sun Feb 2 14:43:31 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 02 Feb 2014 22:43:31 -0000 Subject: [vmkit-commits] [vmkit] r200663 - Add a helper function to build stack traces. Message-ID: <20140202224331.67FD92A6C049@llvm.org> Author: gthomas Date: Sun Feb 2 16:43:31 2014 New Revision: 200663 URL: http://llvm.org/viewvc/llvm-project?rev=200663&view=rev Log: Add a helper function to build stack traces. Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc?rev=200663&r1=200662&r2=200663&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Feb 2 16:43:31 2014 @@ -346,31 +346,34 @@ jboolean JNICALL JVM_IsNaN(jdouble d) { /* * java.lang.Throwable */ +static void addStackElement(int64_t* orig, int64_t*& buf, uint32_t& max, uint32_t& cur, uint64_t val) { + if(cur == max) { + void* prev = buf; + buf = (int64_t*)malloc((max<<1)*sizeof(int64_t)); + memcpy(buf, prev, max*sizeof(int64_t)); + max <<= 1; + if(prev != orig) + free(prev); + } + buf[cur++] = val; +} + void JNICALL JVM_FillInStackTrace(JNIEnv* env, jobject throwable) { enterJVM(); uint32_t cur = 0; uint32_t max = 1024; - int64_t _buf[max]; - int64_t* buf = _buf; + int64_t orig[max]; + int64_t* buf = orig; vmkit::StackWalker walker; - while(walker.next()) { - if(cur == max) { - void* prev = buf; - buf = (int64_t*)malloc((max<<1)*sizeof(int64_t)); - memcpy(buf, prev, max*sizeof(int64_t)); - max <<= 1; - if(prev != _buf) - free(prev); - } - buf[cur++] = (int64_t)(uintptr_t)walker.ip(); - } + while(walker.next()) + addStackElement(orig, buf, max, cur, (int64_t)(uintptr_t)walker.ip()); J3* vm = J3Thread::get()->vm(); jobject backtrace = J3ObjectHandle::doNewArray(vm->typeLong->getArray(), cur); backtrace->setRegionLong(0, buf, 0, cur); - if(buf != _buf) + if(buf != orig) free(buf); throwable->setObject(vm->throwableClassBacktrace, backtrace); From gael.thomas at lip6.fr Sun Feb 2 15:39:25 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 02 Feb 2014 23:39:25 -0000 Subject: [vmkit-commits] [vmkit] r200669 - openjdk stack trace management takes into account inlining. Message-ID: <20140202233925.3A00B2A6C049@llvm.org> Author: gthomas Date: Sun Feb 2 17:39:24 2014 New Revision: 200669 URL: http://llvm.org/viewvc/llvm-project?rev=200669&view=rev Log: openjdk stack trace management takes into account inlining. Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc?rev=200669&r1=200668&r2=200669&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Feb 2 17:39:24 2014 @@ -346,11 +346,12 @@ jboolean JNICALL JVM_IsNaN(jdouble d) { /* * java.lang.Throwable */ -static void addStackElement(int64_t* orig, int64_t*& buf, uint32_t& max, uint32_t& cur, uint64_t val) { +template +static void addStackElement(E* orig, E*& buf, uint32_t& max, uint32_t& cur, E val) { if(cur == max) { void* prev = buf; - buf = (int64_t*)malloc((max<<1)*sizeof(int64_t)); - memcpy(buf, prev, max*sizeof(int64_t)); + buf = (E*)malloc((max<<1)*sizeof(E)); + memcpy(buf, prev, max*sizeof(E)); max <<= 1; if(prev != orig) free(prev); @@ -381,107 +382,107 @@ void JNICALL JVM_FillInStackTrace(JNIEnv leaveJVM(); } -jint JNICALL JVM_GetStackTraceDepth(JNIEnv* env, jobject throwable) { - jint res = 0; - enterJVM(); +static jobject translateStackTrace(jobject throwable) { J3* vm = J3Thread::get()->vm(); J3ObjectHandle* backtrace = throwable->getObject(vm->throwableClassBacktrace); + if(backtrace->vt()->type() == vm->stackTraceElementClass->getArray()) + return backtrace; + bool simplify = 1; - bool ignore = 1; + bool ignore = 1; /* ignore the Throwable:: */ - if(simplify) { - uint32_t max = backtrace->arrayLength(); - int64_t buf[max]; - - while(max && !res) { - for(uint32_t i=0; igetLongAt(i); - vmkit::Safepoint* sf = vm->getSafepoint((void*)cur); - - if(sf) { - J3Method* m = (J3Method*)sf->unit()->getSymbol(sf->functionName()); - if(ignore) { - if(m->name() == vm->initName && m->cl() == throwable->vt()->type()) { - ignore = 0; - } - } else - buf[res++] = cur; + uint32_t cur = 0; + uint32_t max = backtrace->arrayLength() << 1; + J3ObjectHandle* orig[max]; + J3ObjectHandle** buf = orig; + + for(uint32_t i=0; iarrayLength(); i++) { + uintptr_t ip = (uintptr_t)throwable->getObject(vm->throwableClassBacktrace)->getLongAt(i); + + vmkit::Safepoint* sf = vm->getSafepoint((void*)ip); + + if(sf) { + for(uint32_t j=0; jinlineDepth(); j++) { + J3Method* m = (J3Method*)sf->unit()->getSymbol(sf->functionName(j)); + + if(ignore) { + if(m->name() == vm->initName && m->cl() == throwable->vt()->type()) + ignore = 0; + } else { + J3ObjectHandle* element = J3ObjectHandle::doNewObject(vm->stackTraceElementClass); + addStackElement(orig, buf, max, cur, element); + + const vmkit::Name* cn = m->cl()->name(); + uint32_t length = cn->length()+6; + uint32_t lastToken = 0; + char buf[length]; + + for(uint32_t i=0; ilength(); i++) { + if(cn->cStr()[i] == '/') { + buf[i] = '.'; + lastToken = i+1; + } else + buf[i] = cn->cStr()[i]; + } + buf[cn->length()] = 0; + + J3ObjectHandle* className = vm->utfToString(buf); + + snprintf(buf, length, "%s.java", cn->cStr()); + + vm->stackTraceElementClassInit + ->invokeSpecial(element, + className, + m->name() == vm->initName ? vm->utfToString(buf+lastToken) : vm->nameToString(m->name()), + vm->utfToString(buf), + sf->sourceIndex(j)); } } - ignore = 0; + } else if(!simplify) { + J3ObjectHandle* element = J3ObjectHandle::doNewObject(vm->stackTraceElementClass); + J3ObjectHandle* methodName; + J3ObjectHandle* fileName; + Dl_info info; + + if(dladdr((void*)(ip-1), &info)) { + int status; + const char* demangled = abi::__cxa_demangle(info.dli_sname, 0, 0, &status); + const char* name = demangled ? demangled : info.dli_sname; + methodName = vm->utfToString(name); + fileName = vm->utfToString(info.dli_fname); + } else { + char buf[256]; + snprintf(buf, 256, "??@%p", (void*)ip); + methodName = vm->utfToString(buf); + fileName = vm->utfToString("??"); + } + + addStackElement(orig, buf, max, cur, element); + vm->stackTraceElementClassInit->invokeSpecial(element, vm->utfToString(""), methodName, fileName, -1); } + } - jobject newBt = J3ObjectHandle::doNewArray(backtrace->vt()->type()->asArrayClass(), res); - newBt->setRegionLong(0, buf, 0, res); - throwable->setObject(vm->throwableClassBacktrace, newBt); + jobject newBt = J3ObjectHandle::doNewArray(vm->stackTraceElementClass->getArray(), cur); + for(uint32_t i=0; isetObjectAt(i, buf[i]); + throwable->setObject(vm->throwableClassBacktrace, newBt); - } else - res = backtrace->arrayLength(); + return newBt; +} +jint JNICALL JVM_GetStackTraceDepth(JNIEnv* env, jobject throwable) { + jint res = 0; + enterJVM(); + res = translateStackTrace(throwable)->arrayLength(); leaveJVM(); - return res; } jobject JNICALL JVM_GetStackTraceElement(JNIEnv* env, jobject throwable, jint index) { jobject res; - enterJVM(); - J3* vm = J3Thread::get()->vm(); - uintptr_t ip = (uintptr_t)throwable->getObject(vm->throwableClassBacktrace)->getLongAt(index); - J3ObjectHandle* className; - J3ObjectHandle* methodName; - J3ObjectHandle* fileName; - uint32_t lineNumber; - - res = J3ObjectHandle::doNewObject(vm->stackTraceElementClass); - - vmkit::Safepoint* sf = vm->getSafepoint((void*)ip); - - if(!sf) { - lineNumber = -1; - className = vm->utfToString(""); - Dl_info info; - - if(dladdr((void*)(ip-1), &info)) { - int status; - const char* demangled = abi::__cxa_demangle(info.dli_sname, 0, 0, &status); - const char* name = demangled ? demangled : info.dli_sname; - methodName = vm->utfToString(name); - fileName = vm->utfToString(info.dli_fname); - } else { - char buf[256]; - snprintf(buf, 256, "??@%p", (void*)ip); - methodName = vm->utfToString(buf); - fileName = vm->utfToString("??"); - } - } else { - J3Method* m = (J3Method*)sf->unit()->getSymbol(sf->functionName()); - const vmkit::Name* cn = m->cl()->name(); - uint32_t length = cn->length()+6; - uint32_t lastToken = 0; - char buf[length]; - - for(uint32_t i=0; ilength(); i++) { - if(cn->cStr()[i] == '/') { - buf[i] = '.'; - lastToken = i+1; - } else - buf[i] = cn->cStr()[i]; - } - buf[cn->length()] = 0; - - lineNumber = sf->sourceIndex(); - className = vm->utfToString(buf); - methodName = m->name() == vm->initName ? vm->utfToString(buf+lastToken) : vm->nameToString(m->name()); - - snprintf(buf, length, "%s.java", cn->cStr()); - fileName = vm->utfToString(buf); - } - - vm->stackTraceElementClassInit->invokeSpecial(res, className, methodName, fileName, lineNumber); - + res = translateStackTrace(throwable)->getObjectAt(index); leaveJVM(); return res; } From gael.thomas at lip6.fr Mon Feb 3 04:32:59 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 03 Feb 2014 12:32:59 -0000 Subject: [vmkit-commits] [vmkit] r200689 - Prepare the reading of the code attributes. Message-ID: <20140203123259.3E5BF2A6C049@llvm.org> Author: gthomas Date: Mon Feb 3 06:32:58 2014 New Revision: 200689 URL: http://llvm.org/viewvc/llvm-project?rev=200689&view=rev Log: Prepare the reading of the code attributes. Modified: vmkit/branches/mcjit/Makefile.rules vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Modified: vmkit/branches/mcjit/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/Makefile.rules?rev=200689&r1=200688&r2=200689&view=diff ============================================================================== --- vmkit/branches/mcjit/Makefile.rules (original) +++ vmkit/branches/mcjit/Makefile.rules Mon Feb 3 06:32:58 2014 @@ -130,7 +130,7 @@ check:: ############################################################################### # Build system managment ############################################################################### -SELF=$(PROJ_SRC_ROOT)/Makefile.rules $(PROJ_OBJ_ROOT)/Makefile.config $(PROJ_SRC_CWD)/Makefile +#SELF=$(PROJ_SRC_ROOT)/Makefile.rules $(PROJ_OBJ_ROOT)/Makefile.config $(PROJ_SRC_CWD)/Makefile $(PROJ_SRC_ROOT)/configure: $(PROJ_SRC_ROOT)/autoconf/configure.ac $(Echo) "Rebootstraping project" Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=200689&r1=200688&r2=200689&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Mon Feb 3 06:32:58 2014 @@ -211,7 +211,6 @@ namespace j3 { J3ObjectHandle* _protectionDomain; const char* _source; - J3Attributes* readAttributes(J3Reader* reader); void readClassBytes(J3Field* hiddenFields, uint32_t nbHiddenFields); void check(uint16_t idx, uint32_t id=-1); @@ -231,6 +230,10 @@ namespace j3 { public: J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes, J3ObjectHandle* protectionDomain, const char* source); + J3Attributes* readAttributes(J3Reader* reader); + + J3Attributes* attributes() { return _attributes; } + void compileAll(); void aotSnapshot(llvm::Linker* linker); Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=200689&r1=200688&r2=200689&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Mon Feb 3 06:32:58 2014 @@ -35,6 +35,7 @@ namespace j3 { const vmkit::Name* _name; J3Signature* _signature; J3Attributes* _attributes; + J3Attributes* _codeAttributes; uint32_t _index; uint32_t _slot; llvm::Function* _llvmFunction; @@ -77,6 +78,9 @@ namespace j3 { uint32_t index(); + void setCodeAttributes(J3Attributes* attributes) { _codeAttributes = attributes; } + J3Attributes* codeAttributes() const { return _codeAttributes; } + J3Attributes* attributes() const { return _attributes; } uint16_t access() const { return _access; } J3Class* cl() const { return _cl; } Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc?rev=200689&r1=200688&r2=200689&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Mon Feb 3 06:32:58 2014 @@ -8,6 +8,7 @@ #include "j3/j3field.h" #include "j3/j3utf16.h" #include "j3/j3reader.h" +#include "j3/j3attribute.h" #include "jvm.h" #include @@ -413,30 +414,30 @@ static jobject translateStackTrace(jobje J3ObjectHandle* element = J3ObjectHandle::doNewObject(vm->stackTraceElementClass); addStackElement(orig, buf, max, cur, element); - const vmkit::Name* cn = m->cl()->name(); - uint32_t length = cn->length()+6; - uint32_t lastToken = 0; - char buf[length]; - - for(uint32_t i=0; ilength(); i++) { - if(cn->cStr()[i] == '/') { - buf[i] = '.'; - lastToken = i+1; - } else - buf[i] = cn->cStr()[i]; + J3Attribute* sourceAttr = m->cl()->attributes()->lookup(vm->sourceFileAttribute); + const vmkit::Name* sourceFile = 0; + if(sourceAttr) { + J3Reader reader(m->cl()->bytes()); + reader.seek(sourceAttr->offset(), reader.SeekSet); + reader.readU4(); + sourceFile = m->cl()->nameAt(reader.readU2()); } - buf[cn->length()] = 0; - J3ObjectHandle* className = vm->utfToString(buf); + uint32_t lineNumber = -1; + J3Attribute* lineAttr = m->cl()->attributes()->lookup(vm->lineNumberTableAttribute); - snprintf(buf, length, "%s.java", cn->cStr()); + if(lineAttr) { + fprintf(stderr, " find line attribute...\n"); + //sf->sourceIndex(j)); + abort(); + } vm->stackTraceElementClassInit ->invokeSpecial(element, - className, - m->name() == vm->initName ? vm->utfToString(buf+lastToken) : vm->nameToString(m->name()), - vm->utfToString(buf), - sf->sourceIndex(j)); + vm->nameToString(m->cl()->name()), + vm->nameToString(m->name()), + sourceFile ? vm->nameToString(sourceFile) : 0, + lineNumber); } } } else if(!simplify) { Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=200689&r1=200688&r2=200689&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Mon Feb 3 06:32:58 2014 @@ -1774,6 +1774,7 @@ void J3CodeGen::generateJava() { reader.seek(codeLength, reader.SeekCur); exceptions.read(&reader, codeLength); + //method->setCodeAttributes(cl->readAttributes(&reader)); pendingBranchs[topPendingBranchs++] = codeReader->tell(); From gael.thomas at lip6.fr Mon Feb 3 04:36:07 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 03 Feb 2014 12:36:07 -0000 Subject: [vmkit-commits] [vmkit] r200690 - Fix a dependency beg in Makefile.rules. Message-ID: <20140203123607.EDC022A6C049@llvm.org> Author: gthomas Date: Mon Feb 3 06:36:07 2014 New Revision: 200690 URL: http://llvm.org/viewvc/llvm-project?rev=200690&view=rev Log: Fix a dependency beg in Makefile.rules. Modified: vmkit/branches/mcjit/Makefile.rules Modified: vmkit/branches/mcjit/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/Makefile.rules?rev=200690&r1=200689&r2=200690&view=diff ============================================================================== --- vmkit/branches/mcjit/Makefile.rules (original) +++ vmkit/branches/mcjit/Makefile.rules Mon Feb 3 06:36:07 2014 @@ -130,7 +130,7 @@ check:: ############################################################################### # Build system managment ############################################################################### -#SELF=$(PROJ_SRC_ROOT)/Makefile.rules $(PROJ_OBJ_ROOT)/Makefile.config $(PROJ_SRC_CWD)/Makefile +SELF=$(PROJ_SRC_ROOT)/Makefile.rules $(PROJ_OBJ_ROOT)/Makefile.config $(PROJ_SRC_CWD)/Makefile $(PROJ_SRC_ROOT)/configure: $(PROJ_SRC_ROOT)/autoconf/configure.ac $(Echo) "Rebootstraping project" @@ -307,7 +307,7 @@ endif ############################################################################### # Compilation ############################################################################### -DEPEND_OPTIONS=-MMD -MP -MF "$(BUILD_DIR)/$$*.d.tmp" -MT "$(BUILD_DIR)/$$*.bc" -MT "$(BUILD_DIR)/$$*.d" +DEPEND_OPTIONS=-MMD -MP -MF "$(BUILD_DIR)/$$*.d.tmp" -MT "$(BUILD_DIR)/$$*$(RAW).bc" -MT "$(BUILD_DIR)/$$*.d" DOM=then mv -f "$(BUILD_DIR)/$$*.d.tmp" "$(BUILD_DIR)/$$*.d"; else rm -f "$(BUILD_DIR)/$$*.d.tmp"; exit 1; fi $(SONAME)$(SHLIBEXT): $(SO_FILES) From gael.thomas at lip6.fr Mon Feb 3 04:49:37 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 03 Feb 2014 12:49:37 -0000 Subject: [vmkit-commits] [vmkit] r200691 - Inspect LineAttribute to find the line numbers. Message-ID: <20140203124937.E29C02A6C049@llvm.org> Author: gthomas Date: Mon Feb 3 06:49:37 2014 New Revision: 200691 URL: http://llvm.org/viewvc/llvm-project?rev=200691&view=rev Log: Inspect LineAttribute to find the line numbers. Modified: vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=200691&r1=200690&r2=200691&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Mon Feb 3 06:49:37 2014 @@ -78,9 +78,7 @@ namespace j3 { uint32_t index(); - void setCodeAttributes(J3Attributes* attributes) { _codeAttributes = attributes; } - J3Attributes* codeAttributes() const { return _codeAttributes; } - + J3Attributes* codeAttributes(); J3Attributes* attributes() const { return _attributes; } uint16_t access() const { return _access; } J3Class* cl() const { return _cl; } Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc?rev=200691&r1=200690&r2=200691&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Mon Feb 3 06:49:37 2014 @@ -418,18 +418,26 @@ static jobject translateStackTrace(jobje const vmkit::Name* sourceFile = 0; if(sourceAttr) { J3Reader reader(m->cl()->bytes()); - reader.seek(sourceAttr->offset(), reader.SeekSet); - reader.readU4(); + reader.seek(sourceAttr->offset() + 4, reader.SeekSet); sourceFile = m->cl()->nameAt(reader.readU2()); } uint32_t lineNumber = -1; - J3Attribute* lineAttr = m->cl()->attributes()->lookup(vm->lineNumberTableAttribute); - if(lineAttr) { - fprintf(stderr, " find line attribute...\n"); - //sf->sourceIndex(j)); - abort(); + if(m->codeAttributes()) { + J3Attribute* lineAttr = m->codeAttributes()->lookup(vm->lineNumberTableAttribute); + if(lineAttr) { + J3Reader reader(m->cl()->bytes()); + reader.seek(lineAttr->offset() + 4, reader.SeekSet); + uint32_t n = reader.readU2(); + bool found = 0; + for(uint32_t i=0; isourceIndex(j) < reader.readU2()) + found = 1; + else + lineNumber = reader.readU2(); + } + } } vm->stackTraceElementClassInit Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=200691&r1=200690&r2=200691&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Mon Feb 3 06:49:37 2014 @@ -1774,7 +1774,6 @@ void J3CodeGen::generateJava() { reader.seek(codeLength, reader.SeekCur); exceptions.read(&reader, codeLength); - //method->setCodeAttributes(cl->readAttributes(&reader)); pendingBranchs[topPendingBranchs++] = codeReader->tell(); Modified: vmkit/branches/mcjit/lib/j3/vm/j3method.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3method.cc?rev=200691&r1=200690&r2=200691&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Mon Feb 3 06:49:37 2014 @@ -10,6 +10,7 @@ #include "j3/j3codegen.h" #include "j3/j3trampoline.h" #include "j3/j3attribute.h" +#include "j3/j3reader.h" #include "llvm/IR/Type.h" #include "llvm/IR/Module.h" @@ -31,6 +32,21 @@ J3Method::J3Method(uint16_t access, J3Cl _index = -1; } +J3Attributes* J3Method::codeAttributes() { + if(!_codeAttributes) { + J3* vm = J3Thread::get()->vm(); + J3Attribute* codeAttr = attributes()->lookup(vm->codeAttribute); + if(codeAttr) { + J3Reader reader(cl()->bytes()); + reader.seek(codeAttr->offset()+8, reader.SeekSet); + reader.seek(reader.readU4(), reader.SeekCur); + reader.seek(reader.readU2()*8, reader.SeekCur); + _codeAttributes = cl()->readAttributes(&reader); + } + } + return _codeAttributes; +} + vmkit::CompilationUnit* J3Method::unit() { return cl()->loader(); } From gael.thomas at lip6.fr Mon Feb 3 05:02:09 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 03 Feb 2014 13:02:09 -0000 Subject: [vmkit-commits] [vmkit] r200692 - Aggressive inline seems ok. Message-ID: <20140203130209.51D792A6C049@llvm.org> Author: gthomas Date: Mon Feb 3 07:02:09 2014 New Revision: 200692 URL: http://llvm.org/viewvc/llvm-project?rev=200692&view=rev Log: Aggressive inline seems ok. Modified: vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/vmkit/inliner.cc Modified: vmkit/branches/mcjit/lib/j3/vm/j3method.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3method.cc?rev=200692&r1=200691&r2=200692&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Mon Feb 3 07:02:09 2014 @@ -52,7 +52,7 @@ vmkit::CompilationUnit* J3Method::unit() } uint64_t J3Method::inlineWeight() { - if(0 && J3Thread::get()->vm()->options()->enableInlining) + if(1 && J3Thread::get()->vm()->options()->enableInlining) return vmkit::Symbol::inlineWeight(); else return (uint64_t)-1; Modified: vmkit/branches/mcjit/lib/vmkit/inliner.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/inliner.cc?rev=200692&r1=200691&r2=200692&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/inliner.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/inliner.cc Mon Feb 3 07:02:09 2014 @@ -109,6 +109,12 @@ namespace vmkit { llvm::cast(gv)->getFunctionType()) : function->getParent()->getOrInsertGlobal(gv->getName().data(), gv->getType()->getContainedType(0)); + if(curSymbol && curSymbol->unit()) { + Symbol* remoteSymbol = curSymbol->unit()->getSymbol(gv->getName().data(), 0); + if(remoteSymbol) + originalUnit->addSymbol(gv->getName().data(), remoteSymbol); + } + //fprintf(stderr, "<<>>: %s\n", gv->getName().data()); insn->setOperand(i, copy); } From gael.thomas at lip6.fr Wed Feb 5 02:04:20 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Wed, 05 Feb 2014 10:04:20 -0000 Subject: [vmkit-commits] [vmkit] r200831 - Better heuristic for inlining (basically, the previous one was buggy:)) Message-ID: <20140205100420.7F27A2A6C04B@llvm.org> Author: gthomas Date: Wed Feb 5 04:04:20 2014 New Revision: 200831 URL: http://llvm.org/viewvc/llvm-project?rev=200831&view=rev Log: Better heuristic for inlining (basically, the previous one was buggy:)) Modified: vmkit/branches/mcjit/lib/vmkit/compiler.cc vmkit/branches/mcjit/lib/vmkit/inliner.cc Modified: vmkit/branches/mcjit/lib/vmkit/compiler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/compiler.cc?rev=200831&r1=200830&r2=200831&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/compiler.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/compiler.cc Wed Feb 5 04:04:20 2014 @@ -31,17 +31,15 @@ uint64_t Symbol::inlineWeight() { if(cachedWeight) return cachedWeight; - uint64_t infinity = (uint64_t)-1; - if(llvmFunction()->size() > 4) - return cachedWeight = infinity; + return cachedWeight = (uint64_t)-1; uint64_t weight = 0; for (llvm::Function::iterator bit=llvmFunction()->begin(); bit!=llvmFunction()->end(); bit++) weight += bit->size(); - weight = weight * 100; + weight = weight * 256; return cachedWeight = weight; } @@ -92,7 +90,7 @@ CompilationUnit::CompilationUnit(BumpAll pm->add(vmkit::createFunctionInlinerPass(this, onlyAlwaysInline)); pm->add(llvm::createCFGSimplificationPass()); // Clean up disgusting code -#if 0 +#if 1 pm->add(llvm::createPromoteMemoryToRegisterPass());// Kill useless allocas pm->add(llvm::createInstructionCombiningPass()); // Cleanup for scalarrepl. pm->add(llvm::createScalarReplAggregatesPass()); // Break up aggregate allocas Modified: vmkit/branches/mcjit/lib/vmkit/inliner.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/inliner.cc?rev=200831&r1=200830&r2=200831&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/inliner.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/inliner.cc Wed Feb 5 04:04:20 2014 @@ -14,35 +14,50 @@ #include namespace vmkit { + class InlineBB { + public: + Symbol* symbol; + llvm::BasicBlock* bb; + uint64_t threshold; + + InlineBB(Symbol* _symbol, llvm::BasicBlock* _bb, uint64_t _threshold) { + symbol = _symbol; + bb = _bb; + threshold = _threshold; + } + }; + class FunctionInliner { public: llvm::Function* function; llvm::SmallPtrSet visited; - llvm::SmallVector, 8> visitStack; + llvm::SmallVector visitStack; CompilationUnit* originalUnit; Symbol* curSymbol; bool onlyAlwaysInline; uint64_t inlineThreshold; - FunctionInliner(CompilationUnit* unit, llvm::Function* _function, uint64_t inlineThreshold, bool _onlyAlwaysInline) { + FunctionInliner(CompilationUnit* unit, llvm::Function* _function, uint64_t _inlineThreshold, bool _onlyAlwaysInline) { function = _function; originalUnit = unit; onlyAlwaysInline = _onlyAlwaysInline; + inlineThreshold = _inlineThreshold; push(0, &function->getEntryBlock()); } void push(Symbol* symbol, llvm::BasicBlock* bb) { if(visited.insert(bb)) - visitStack.push_back(std::make_pair(symbol, bb)); + visitStack.push_back(InlineBB(symbol, bb, inlineThreshold)); } llvm::BasicBlock* pop() { - std::pair top = visitStack.pop_back_val(); - curSymbol = top.first; - return top.second; + InlineBB top = visitStack.pop_back_val(); + curSymbol = top.symbol; + inlineThreshold = top.threshold; + return top.bb; } - Symbol* tryInline(llvm::Function* callee) { + Symbol* tryInline(llvm::Function* callee, uint64_t* weight) { if(callee->isIntrinsic()) return 0; @@ -72,11 +87,21 @@ namespace vmkit { symbol = new(unit->allocator()) NativeSymbol(callee, addr); unit->addSymbol(id, symbol); } - //fprintf(stderr, " weight: %lld\n", symbol->inlineWeight()); + + if(bc->hasFnAttribute(llvm::Attribute::NoInline)) + return 0; + if(bc->hasFnAttribute(llvm::Attribute::AlwaysInline)) + return symbol; + if(onlyAlwaysInline) + return 0; + + *weight = symbol->inlineWeight(); + if(*weight == -1) + return 0; - return (!bc->hasFnAttribute(llvm::Attribute::NoInline) - && (bc->hasFnAttribute(llvm::Attribute::AlwaysInline) || - (!onlyAlwaysInline && (uint64_t)(symbol->inlineWeight()-1) < inlineThreshold))) ? symbol : 0; + //fprintf(stderr, " %s weight: %lld/%lld\n", bc->getName().data(), *weight, inlineThreshold); + + return *weight < inlineThreshold ? symbol : 0; } bool visitBB(llvm::BasicBlock* bb) { @@ -131,13 +156,14 @@ namespace vmkit { if(!callee) continue; - - Symbol* symbol = tryInline(callee); + + uint64_t weight; + Symbol* symbol = tryInline(callee, &weight); if(symbol) { llvm::Function* bc = symbol->llvmFunction(); - //fprintf(stderr, " inlining %s in %s\n", bc->getName().data(), function->getName().data()); + fprintf(stderr, " inlining %s in %s\n", bc->getName().data(), function->getName().data()); if(llvm::isa(insn)) { llvm::TerminatorInst* terminator = llvm::cast(insn); @@ -161,6 +187,7 @@ namespace vmkit { if(isInlined) { curSymbol = symbol; + inlineThreshold -= weight; if(prev) it = prev; else { @@ -234,6 +261,6 @@ namespace vmkit { #endif llvm::FunctionPass* createFunctionInlinerPass(CompilationUnit* compiler, bool onlyAlwaysInline) { - return new FunctionInlinerPass(compiler, 2000, onlyAlwaysInline); + return new FunctionInlinerPass(compiler, 25*256, onlyAlwaysInline); /* aka 25 instructions */ } } From gael.thomas at lip6.fr Wed Feb 5 04:34:25 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Wed, 05 Feb 2014 12:34:25 -0000 Subject: [vmkit-commits] [vmkit] r200834 - Stack size is now fixed (important for inlining) Message-ID: <20140205123425.C81522A6C04B@llvm.org> Author: gthomas Date: Wed Feb 5 06:34:25 2014 New Revision: 200834 URL: http://llvm.org/viewvc/llvm-project?rev=200834&view=rev Log: Stack size is now fixed (important for inlining) Modified: vmkit/branches/mcjit/include/j3/j3options.h vmkit/branches/mcjit/include/vmkit/allocator.h vmkit/branches/mcjit/include/vmkit/config.h.in vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s vmkit/branches/mcjit/lib/j3/vm/j3options.cc vmkit/branches/mcjit/lib/vmkit/allocator.cc vmkit/branches/mcjit/lib/vmkit/inliner.cc Modified: vmkit/branches/mcjit/include/j3/j3options.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3options.h?rev=200834&r1=200833&r2=200834&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3options.h (original) +++ vmkit/branches/mcjit/include/j3/j3options.h Wed Feb 5 06:34:25 2014 @@ -49,8 +49,6 @@ namespace j3 { uint32_t debugLinking; uint32_t debugLifeCycle; - uintptr_t stackSize; - bool isAOT; const char* aotFile; bool enableInlining; Modified: vmkit/branches/mcjit/include/vmkit/allocator.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/allocator.h?rev=200834&r1=200833&r2=200834&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/allocator.h (original) +++ vmkit/branches/mcjit/include/vmkit/allocator.h Wed Feb 5 06:34:25 2014 @@ -15,17 +15,19 @@ #include #include +#include "vmkit/config.h" + namespace vmkit { class BumpAllocatorNode { /* always the first bytes of a bucket */ public: BumpAllocatorNode* next; - uint8_t* top; + uint8_t* top; }; class BumpAllocator { static const size_t bucketSize = 64*1024; private: - pthread_mutex_t mutex; + pthread_mutex_t mutex; BumpAllocatorNode* current; void* operator new(size_t n); @@ -121,13 +123,12 @@ namespace vmkit { static pthread_mutex_t mutex; static uintptr_t baseStack; - static uintptr_t topStack; static uintptr_t _magic; static std::vector* spaces; static std::vector* freeThreads; public: - static void initialize(uintptr_t minThreadStruct, uintptr_t minFullSize); + static void initialize(uintptr_t minThreadStruct); static void* allocate(); static void release(void* thread); @@ -138,7 +139,7 @@ namespace vmkit { static void* stackAddr(void* thread); static size_t stackSize(void* thread); - static uintptr_t magic() { return _magic; } + static uintptr_t magic() { return -VMKIT_STACK_SIZE; } }; } // end namespace vmkit Modified: vmkit/branches/mcjit/include/vmkit/config.h.in URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/config.h.in?rev=200834&r1=200833&r2=200834&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/config.h.in (original) +++ vmkit/branches/mcjit/include/vmkit/config.h.in Wed Feb 5 06:34:25 2014 @@ -1,3 +1,5 @@ -#define SHLIBEXT "@SHLIBEXT@" \ No newline at end of file +#define SHLIBEXT "@SHLIBEXT@" + +#define VMKIT_STACK_SIZE 0x80*0x1000 Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3.cc?rev=200834&r1=200833&r2=200834&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Wed Feb 5 06:34:25 2014 @@ -79,7 +79,7 @@ void J3::start(int argc, char** argv) { _options.process(argc, argv); J3Lib::processOptions(this); - vmkit::ThreadAllocator::initialize(sizeof(J3Thread), options()->stackSize); + vmkit::ThreadAllocator::initialize(sizeof(J3Thread)); J3Thread* thread = new J3ThreadBootstrap(this); Modified: vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s?rev=200834&r1=200833&r2=200834&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s Wed Feb 5 06:34:25 2014 @@ -1,5 +1,7 @@ +#include "vmkit/config.h" + .section __DATA,__data - .globl __ZN2j312J3Trampoline9argOffsetE, __ZN5vmkit15ThreadAllocator6_magicE + .globl __ZN2j312J3Trampoline9argOffsetE .globl _trampoline_generic, _trampoline_generic_method, _trampoline_generic_resolver, _trampoline_generic_end _trampoline_generic: @@ -20,7 +22,7 @@ _trampoline_generic_end: _trampoline_save: mov %rsp, %rax - and __ZN5vmkit15ThreadAllocator6_magicE(%rip), %rax + and $-VMKIT_STACK_SIZE, %rax add __ZN2j312J3Trampoline9argOffsetE(%rip), %rax mov %xmm0, 0(%rax) Modified: vmkit/branches/mcjit/lib/j3/vm/j3options.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3options.cc?rev=200834&r1=200833&r2=200834&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Wed Feb 5 06:34:25 2014 @@ -26,8 +26,6 @@ J3Options::J3Options() { genDebugExecute = 0;//debugExecute ? 1 : 0; - stackSize = 0x80*0x1000; - isAOT = 0; enableInlining = 1; } Modified: vmkit/branches/mcjit/lib/vmkit/allocator.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/allocator.cc?rev=200834&r1=200833&r2=200834&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/allocator.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/allocator.cc Wed Feb 5 06:34:25 2014 @@ -10,7 +10,6 @@ using namespace vmkit; pthread_mutex_t ThreadAllocator::mutex; uintptr_t ThreadAllocator::baseStack = 0; -uintptr_t ThreadAllocator::topStack = 0; uintptr_t ThreadAllocator::_magic = 0; std::vector* ThreadAllocator::spaces = 0; std::vector* ThreadAllocator::freeThreads = 0; @@ -94,7 +93,7 @@ void PermanentObject::operator delete[]( //Thread::get()->vm()->internalError("should not happen"); } -void ThreadAllocator::initialize(uintptr_t minThreadStruct, uintptr_t minFullSize) { +void ThreadAllocator::initialize(uintptr_t minThreadStruct) { if(spaces) VMKit::internalError("thread allocation system is already initialized"); spaces = new std::vector(); @@ -107,18 +106,13 @@ void ThreadAllocator::initialize(uintptr minThreadStruct = ((minThreadStruct - 1) & -PAGE_SIZE) + PAGE_SIZE; baseStack = minThreadStruct + PAGE_SIZE; - uintptr_t min = PTHREAD_STACK_MIN + minThreadStruct + (PAGE_SIZE<<1); - if(minFullSize < min) - minFullSize = min; - - topStack = 1L << (__builtin_clzl(0) - __builtin_clzl(minFullSize-1)); - _magic = -topStack; + _magic = -VMKIT_STACK_SIZE; } void* ThreadAllocator::allocate() { pthread_mutex_lock(&mutex); if(!freeThreads->size()) { - void* space = mmap(0, topStack*refill, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); + void* space = mmap(0, VMKIT_STACK_SIZE*refill, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); if(space == MAP_FAILED) { fprintf(stderr, "unable to allocate a thread\n"); @@ -127,13 +121,13 @@ void* ThreadAllocator::allocate() { spaces->push_back(space); - uintptr_t base = (((uintptr_t)space - 1) & -topStack) + topStack; + uintptr_t base = (((uintptr_t)space - 1) & -VMKIT_STACK_SIZE) + VMKIT_STACK_SIZE; uint32_t n = (base == (uintptr_t)space) ? refill : (refill - 1); for(uint32_t i=0; ipush_back((void*)base); - base += topStack; + base += VMKIT_STACK_SIZE; } } @@ -154,7 +148,7 @@ void* ThreadAllocator::stackAddr(void* t } size_t ThreadAllocator::stackSize(void* thread) { - return topStack - baseStack; + return VMKIT_STACK_SIZE - baseStack; } void* ThreadAllocator::alternateStackAddr(void* thread) { Modified: vmkit/branches/mcjit/lib/vmkit/inliner.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/inliner.cc?rev=200834&r1=200833&r2=200834&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/inliner.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/inliner.cc Wed Feb 5 06:34:25 2014 @@ -163,7 +163,7 @@ namespace vmkit { if(symbol) { llvm::Function* bc = symbol->llvmFunction(); - fprintf(stderr, " inlining %s in %s\n", bc->getName().data(), function->getName().data()); + //fprintf(stderr, " inlining %s in %s\n", bc->getName().data(), function->getName().data()); if(llvm::isa(insn)) { llvm::TerminatorInst* terminator = llvm::cast(insn); From gael.thomas at lip6.fr Wed Feb 5 04:43:52 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Wed, 05 Feb 2014 12:43:52 -0000 Subject: [vmkit-commits] [vmkit] r200835 - Continue the simplification of Thread::get() Message-ID: <20140205124352.2243F2A6C04B@llvm.org> Author: gthomas Date: Wed Feb 5 06:43:51 2014 New Revision: 200835 URL: http://llvm.org/viewvc/llvm-project?rev=200835&view=rev Log: Continue the simplification of Thread::get() Modified: vmkit/branches/mcjit/include/vmkit/allocator.h vmkit/branches/mcjit/include/vmkit/thread.h vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3object.cc vmkit/branches/mcjit/lib/vmkit/allocator.cc vmkit/branches/mcjit/lib/vmkit/thread.cc Modified: vmkit/branches/mcjit/include/vmkit/allocator.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/allocator.h?rev=200835&r1=200834&r2=200835&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/allocator.h (original) +++ vmkit/branches/mcjit/include/vmkit/allocator.h Wed Feb 5 06:43:51 2014 @@ -15,8 +15,6 @@ #include #include -#include "vmkit/config.h" - namespace vmkit { class BumpAllocatorNode { /* always the first bytes of a bucket */ public: @@ -123,7 +121,6 @@ namespace vmkit { static pthread_mutex_t mutex; static uintptr_t baseStack; - static uintptr_t _magic; static std::vector* spaces; static std::vector* freeThreads; @@ -138,8 +135,6 @@ namespace vmkit { static void* stackAddr(void* thread); static size_t stackSize(void* thread); - - static uintptr_t magic() { return -VMKIT_STACK_SIZE; } }; } // end namespace vmkit Modified: vmkit/branches/mcjit/include/vmkit/thread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/thread.h?rev=200835&r1=200834&r2=200835&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/thread.h (original) +++ vmkit/branches/mcjit/include/vmkit/thread.h Wed Feb 5 06:43:51 2014 @@ -34,8 +34,8 @@ namespace vmkit { VMKit* vm() { return _vm; } static uintptr_t getThreadMask(); - static Thread* get(void* ptr); - static Thread* get(); + static Thread* get(void* ptr); + static Thread* get(); bool registerSignal(int n, sa_action_t handler); Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=200835&r1=200834&r2=200835&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Wed Feb 5 06:43:51 2014 @@ -231,7 +231,7 @@ llvm::Value* J3CodeGen::typeDescriptor(J llvm::Value* J3CodeGen::spToCurrentThread(llvm::Value* sp) { return builder.CreateIntToPtr(builder.CreateAnd(builder.CreatePtrToInt(sp, uintPtrTy), - llvm::ConstantInt::get(uintPtrTy, vmkit::Thread::getThreadMask())), + llvm::ConstantInt::get(uintPtrTy, vmkit::Thread::getThreadMask())), vm->typeJ3Thread); } Modified: vmkit/branches/mcjit/lib/j3/vm/j3object.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3object.cc?rev=200835&r1=200834&r2=200835&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Wed Feb 5 06:43:51 2014 @@ -368,7 +368,7 @@ bool J3Object::isLockOwner() { if(isInflated(header)) /* inflated */ return asMonitor(header)->isOwner(self); else - return !isUnlocked(header) && (J3Thread*)(header & J3Thread::getThreadMask()) == self; + return !isUnlocked(header) && (J3Thread*)J3Thread::get((void*)header) == self; } /* Modified: vmkit/branches/mcjit/lib/vmkit/allocator.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/allocator.cc?rev=200835&r1=200834&r2=200835&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/allocator.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/allocator.cc Wed Feb 5 06:43:51 2014 @@ -1,6 +1,7 @@ #include "vmkit/allocator.h" #include "vmkit/thread.h" #include "vmkit/vmkit.h" +#include "vmkit/config.h" #include #include #include @@ -10,7 +11,6 @@ using namespace vmkit; pthread_mutex_t ThreadAllocator::mutex; uintptr_t ThreadAllocator::baseStack = 0; -uintptr_t ThreadAllocator::_magic = 0; std::vector* ThreadAllocator::spaces = 0; std::vector* ThreadAllocator::freeThreads = 0; @@ -105,8 +105,6 @@ void ThreadAllocator::initialize(uintptr minThreadStruct = ((minThreadStruct - 1) & -PAGE_SIZE) + PAGE_SIZE; baseStack = minThreadStruct + PAGE_SIZE; - - _magic = -VMKIT_STACK_SIZE; } void* ThreadAllocator::allocate() { Modified: vmkit/branches/mcjit/lib/vmkit/thread.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/thread.cc?rev=200835&r1=200834&r2=200835&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/thread.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/thread.cc Wed Feb 5 06:43:51 2014 @@ -1,6 +1,7 @@ #include "vmkit/thread.h" #include "vmkit/system.h" #include "vmkit/vmkit.h" +#include "vmkit/config.h" using namespace vmkit; @@ -31,7 +32,7 @@ Thread* Thread::get(void* ptr) { } uintptr_t Thread::getThreadMask() { - return ThreadAllocator::magic(); + return -VMKIT_STACK_SIZE; } void Thread::registerSignalInternal(int n, sa_action_t handler, bool altStack) { From gael.thomas at lip6.fr Wed Feb 5 04:58:30 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Wed, 05 Feb 2014 12:58:30 -0000 Subject: [vmkit-commits] [vmkit] r200836 - Do not directly see anymore TLS computation in j3codegen.cc Message-ID: <20140205125830.E465F2A6C04B@llvm.org> Author: gthomas Date: Wed Feb 5 06:58:30 2014 New Revision: 200836 URL: http://llvm.org/viewvc/llvm-project?rev=200836&view=rev Log: Do not directly see anymore TLS computation in j3codegen.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/include/j3/j3meta.def vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=200836&r1=200835&r2=200836&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Wed Feb 5 06:58:30 2014 @@ -204,7 +204,6 @@ namespace j3 { #undef _x llvm::GlobalValue* gvTypeInfo; /* typename void* */ llvm::Function* gcRoot; - llvm::Function* frameAddress; llvm::Function* stackMap; llvm::Function* patchPoint64; llvm::Function* patchPointVoid; Modified: vmkit/branches/mcjit/include/j3/j3meta.def URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=200836&r1=200835&r2=200836&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3meta.def (original) +++ vmkit/branches/mcjit/include/j3/j3meta.def Wed Feb 5 06:58:30 2014 @@ -25,6 +25,7 @@ _x(funcCXAEndCatch, "__c _x(funcFake, "j3::J3::forceSymbolDefinition()", 0) _x(funcJ3ThreadGet, "j3::J3Thread::get()", 0) +_x(funcJ3ThreadGetP, "j3::J3Thread::get(void*)", 0) _x(funcVMKitThreadGet, "vmkit::Thread::get()", 0) _x(funcVMKitThreadGetP, "vmkit::Thread::get(void*)", 0) _x(funcJ3ThreadJniEnv, "j3::J3Thread::jniEnv()", 0) Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=200836&r1=200835&r2=200836&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Wed Feb 5 06:58:30 2014 @@ -86,8 +86,6 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato gcRoot = vm->getGCRoot(module); - frameAddress = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::frameaddress); - #if 0 //stackMap = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::experimental_stackmap); //patchPointVoid = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::experimental_patchpoint_i64); @@ -230,13 +228,13 @@ llvm::Value* J3CodeGen::typeDescriptor(J } llvm::Value* J3CodeGen::spToCurrentThread(llvm::Value* sp) { - return builder.CreateIntToPtr(builder.CreateAnd(builder.CreatePtrToInt(sp, uintPtrTy), - llvm::ConstantInt::get(uintPtrTy, vmkit::Thread::getThreadMask())), - vm->typeJ3Thread); + if(sp->getType()->isIntegerTy()) + sp = builder.CreateIntToPtr(sp, funcJ3ThreadGetP->getFunctionType()->getParamType(0)); + return builder.CreateCall(funcJ3ThreadGetP, sp); } llvm::Value* J3CodeGen::currentThread() { - return spToCurrentThread(builder.CreateCall(frameAddress, builder.getInt32(0))); + return builder.CreateCall(funcJ3ThreadGet); } void J3CodeGen::monitorEnter(llvm::Value* obj) { @@ -257,7 +255,7 @@ void J3CodeGen::monitorEnter(llvm::Value builder.CreateStore(builder.CreateIntToPtr(header, recordPtrTy), recordPtr); builder.CreateCondBr(builder.CreateICmpEQ(currentThread(), spToCurrentThread(header)), - stackLocked, tryStackLock); + stackLocked, tryStackLock); /* try to stack lock */ builder.SetInsertPoint(tryStackLock); @@ -304,7 +302,7 @@ void J3CodeGen::monitorExit(llvm::Value* llvm::Value* header = builder.CreateLoad(headerPtr); builder.CreateCondBr(builder.CreateICmpEQ(currentThread(), spToCurrentThread(header)), - stackUnlock, monitorUnlock); + stackUnlock, monitorUnlock); /* ok, I'm the owner */ builder.SetInsertPoint(stackUnlock); From gael.thomas at lip6.fr Wed Feb 5 07:57:09 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Wed, 05 Feb 2014 15:57:09 -0000 Subject: [vmkit-commits] [vmkit] r200846 - monitor enter and monitor exit are now only written in C++ and inlined in JITted code. Message-ID: <20140205155709.F06AC2A6C04B@llvm.org> Author: gthomas Date: Wed Feb 5 09:57:09 2014 New Revision: 200846 URL: http://llvm.org/viewvc/llvm-project?rev=200846&view=rev Log: monitor enter and monitor exit are now only written in C++ and inlined in JITted code. Modified: vmkit/branches/mcjit/include/j3/j3meta.def vmkit/branches/mcjit/include/j3/j3monitor.h vmkit/branches/mcjit/include/j3/j3object.h vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3object.cc Modified: vmkit/branches/mcjit/include/j3/j3meta.def URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=200846&r1=200845&r2=200846&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3meta.def (original) +++ vmkit/branches/mcjit/include/j3/j3meta.def Wed Feb 5 09:57:09 2014 @@ -4,7 +4,7 @@ _x(funcJ3TypeJavaClass, "j3: _x(funcJniEnv, "j3::J3::jniEnv()", 0) _x(funcJ3ArrayObjectMultianewArray, "j3::J3ArrayObject::multianewArray(j3::J3ArrayClass*, unsigned int, unsigned int*)", 0) _x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)", 0) -_x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*)", 0) +_x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*, j3::J3LockRecord*)", 0) _x(funcJ3ObjectMonitorExit, "j3::J3Object::monitorExit(j3::J3Object*)", 0) _x(funcThrowException, "vmkit::VMKit::throwException(void*)", 0) _x(funcReplayException, "j3::J3Thread::replayException()", 0) Modified: vmkit/branches/mcjit/include/j3/j3monitor.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3monitor.h?rev=200846&r1=200845&r2=200846&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3monitor.h (original) +++ vmkit/branches/mcjit/include/j3/j3monitor.h Wed Feb 5 09:57:09 2014 @@ -11,15 +11,7 @@ namespace vmkit { namespace j3 { class J3Thread; class J3Object; - - class J3LockRecord { - public: - static const uint32_t gepHeader = 0; - static const uint32_t gepLockCount = 1; - - uintptr_t header; - uint32_t lockCount; - }; + class J3LockRecord; class J3Monitor { friend class J3MonitorManager; @@ -39,7 +31,7 @@ namespace j3 { void init(J3Monitor* next); /* acquire the lock for the next inflate */ public: - bool isDeflatable(); /* acquire the lock for the next inflate */ + bool isDeflatable(); /* acquire the lock for the next inflate */ J3Monitor* prepare(J3Object* _object, uintptr_t header, J3LockRecord* _record); J3Monitor* prepare(); Modified: vmkit/branches/mcjit/include/j3/j3object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=200846&r1=200845&r2=200846&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3object.h (original) +++ vmkit/branches/mcjit/include/j3/j3object.h Wed Feb 5 09:57:09 2014 @@ -25,6 +25,15 @@ namespace j3 { class J3Monitor; class J3LockRecord; + class J3LockRecord { + public: + static const uint32_t gepHeader = 0; + static const uint32_t gepLockCount = 1; + + uintptr_t header; + uint32_t lockCount; + }; + // see: Cliff Click and John Rose. 2002. Fast subtype checking in the HotSpot JVM. // In Proceedings of the 2002 joint ACM-ISCOPE conference on Java Grande (JGI '02). ACM, New York, NY, USA, 96-107. class J3TypeChecker { @@ -113,8 +122,8 @@ namespace j3 { static J3LockRecord* asLockRecord(uintptr_t header) { return (J3LockRecord*)header; } static J3Monitor* asMonitor(uintptr_t header) { return (J3Monitor*)(header & ~3); } - static void monitorEnter(J3Object* obj); - static void monitorExit(J3Object* obj); + static void monitorEnter(J3Object* object, J3LockRecord* lockRecord) __attribute__((always_inline)); + static void monitorExit(J3Object* object) __attribute__((always_inline)); static J3Object* allocate(J3VirtualTable* vt, uintptr_t n); static J3Object* doNew(J3Class* cl); Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=200846&r1=200845&r2=200846&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Wed Feb 5 09:57:09 2014 @@ -238,100 +238,11 @@ llvm::Value* J3CodeGen::currentThread() } void J3CodeGen::monitorEnter(llvm::Value* obj) { - llvm::Type* recordTy = vm->typeJ3LockRecord; - llvm::Type* recordPtrTy = vm->typeJ3LockRecord->getPointerTo(); - - llvm::AllocaInst* recordPtr = builder.CreateAlloca(recordPtrTy); - - llvm::BasicBlock* ok = forwardBranch("lock-ok", codeReader->tell(), 0, 0); - llvm::BasicBlock* stackLocked = newBB("stack-locked"); - llvm::BasicBlock* tryStackLock = newBB("try-stack-lock"); - llvm::BasicBlock* stackFail = newBB("stack-lock-fail"); - - /* already stack locked by myself? */ - llvm::Value* gepH[] = { builder.getInt32(0), builder.getInt32(J3Object::gepHeader) }; - llvm::Value* headerPtr = builder.CreateGEP(obj, gepH); - llvm::Value* header = builder.CreateLoad(headerPtr); - - builder.CreateStore(builder.CreateIntToPtr(header, recordPtrTy), recordPtr); - builder.CreateCondBr(builder.CreateICmpEQ(currentThread(), spToCurrentThread(header)), - stackLocked, tryStackLock); - - /* try to stack lock */ - builder.SetInsertPoint(tryStackLock); - llvm::AllocaInst* record = builder.CreateAlloca(recordTy); - builder.CreateStore(record, recordPtr); - llvm::Value* gepR[] = { builder.getInt32(0), builder.getInt32(J3LockRecord::gepHeader) }; - builder.CreateStore(header, builder.CreateGEP(record, gepR)); - llvm::Value* gepC[] = { builder.getInt32(0), builder.getInt32(J3LockRecord::gepLockCount) }; - builder.CreateStore(builder.getInt32(0), builder.CreateGEP(record, gepC)); - llvm::Value* orig = builder.CreateOr(builder.CreateAnd(header, llvm::ConstantInt::get(uintPtrTy, ~6)), - llvm::ConstantInt::get(uintPtrTy, 1)); /* ...001 */ - llvm::Value* res = builder.CreateAtomicCmpXchg(headerPtr, - orig, - builder.CreatePtrToInt(record, uintPtrTy), - llvm::SequentiallyConsistent, - llvm::CrossThread); - builder.CreateCondBr(builder.CreateICmpEQ(res, orig), stackLocked, stackFail); - - /* stack locked, increment the counter */ - builder.SetInsertPoint(stackLocked); - llvm::Value* countPtr = builder.CreateGEP(builder.CreateLoad(recordPtr), gepC); - builder.CreateStore(builder.CreateAdd(builder.CreateLoad(countPtr), builder.getInt32(1)), countPtr); - builder.CreateBr(ok); - - /* unable to stack lock, fall back to monitor */ - builder.SetInsertPoint(stackFail); - builder.CreateCall(funcJ3ObjectMonitorEnter, obj); - builder.CreateBr(ok); + builder.CreateCall2(funcJ3ObjectMonitorEnter, obj, builder.CreateAlloca(vm->typeJ3LockRecord)); } void J3CodeGen::monitorExit(llvm::Value* obj) { - llvm::Type* recordPtrTy = vm->typeJ3LockRecord->getPointerTo(); - - llvm::BasicBlock* ok = forwardBranch("unlock-ok", codeReader->tell(), 0, 0); - llvm::BasicBlock* stackUnlock = newBB("stack-unlock"); - //llvm::BasicBlock* tryStackLock = newBB("try-stack-lock"); - llvm::BasicBlock* monitorUnlock = newBB("monitor-unlock"); - llvm::BasicBlock* stackRelease = newBB("stack-release"); - llvm::BasicBlock* stackRec = newBB("stack-rec"); - - /* stack locked by myself? */ - llvm::Value* gepH[] = { builder.getInt32(0), builder.getInt32(J3Object::gepHeader) }; - llvm::Value* headerPtr = builder.CreateGEP(obj, gepH); - llvm::Value* header = builder.CreateLoad(headerPtr); - - builder.CreateCondBr(builder.CreateICmpEQ(currentThread(), spToCurrentThread(header)), - stackUnlock, monitorUnlock); - - /* ok, I'm the owner */ - builder.SetInsertPoint(stackUnlock); - llvm::Value* gepC[] = { builder.getInt32(0), builder.getInt32(J3LockRecord::gepLockCount) }; - llvm::Value* recordPtr = builder.CreateIntToPtr(header, recordPtrTy); - llvm::Value* countPtr = builder.CreateGEP(recordPtr, gepC); - llvm::Value* count = builder.CreateSub(builder.CreateLoad(countPtr), builder.getInt32(1)); - builder.CreateCondBr(builder.CreateICmpEQ(count, builder.getInt32(0)), stackRelease, stackRec); - - /* last unlock */ - builder.SetInsertPoint(stackRelease); - llvm::Value* gepR[] = { builder.getInt32(0), builder.getInt32(J3LockRecord::gepHeader) }; - llvm::Value* orig = builder.CreateLoad(builder.CreateGEP(recordPtr, gepR)); - llvm::Value* res = builder.CreateAtomicCmpXchg(headerPtr, - header, - orig, - llvm::SequentiallyConsistent, - llvm::CrossThread); - builder.CreateCondBr(builder.CreateICmpEQ(res, header), ok, monitorUnlock); - - /* recursive unlock */ - builder.SetInsertPoint(stackRec); - builder.CreateStore(count, countPtr); - builder.CreateBr(ok); - - /* monitor unlock */ - builder.SetInsertPoint(monitorUnlock); builder.CreateCall(funcJ3ObjectMonitorExit, obj); - builder.CreateBr(ok); } void J3CodeGen::resolveJ3ObjectType(J3ObjectType* cl) { Modified: vmkit/branches/mcjit/lib/j3/vm/j3object.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3object.cc?rev=200846&r1=200845&r2=200846&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Wed Feb 5 09:57:09 2014 @@ -287,12 +287,40 @@ J3Object* J3Object::doNew(J3Class* cl) { return allocate(cl->vt(), cl->structSize()); } -void J3Object::monitorEnter(J3Object* obj) { - J3::internalError("implement me: monitor"); +void J3Object::monitorEnter(J3Object* obj, J3LockRecord* newRecord) { + volatile uintptr_t* pheader = &obj->_header; + uintptr_t header = *pheader; + + if(isStackLocked(header)) { + J3LockRecord* record = asLockRecord(header); + if(vmkit::Thread::get(record) == vmkit::Thread::get()) { + record->lockCount++; + return; + } + } else if(isUnlocked(header)) { + newRecord->header = header; + newRecord->lockCount = 1; + if(__sync_val_compare_and_swap(pheader, header, (uintptr_t)newRecord) == header) + return; + } + obj->inflate()->lock(); } void J3Object::monitorExit(J3Object* obj) { - J3::internalError("implement me: monitor"); + volatile uintptr_t* pheader = &obj->_header; + uintptr_t header = *pheader; + + if(isStackLocked(header)) { + J3LockRecord* record = asLockRecord(header); + if(vmkit::Thread::get(record) == vmkit::Thread::get()) { + if(!--record->lockCount) { + if(__sync_val_compare_and_swap(pheader, header, record->header) == header) + return; + } else + return; + } + } + obj->inflate()->unlock(); } uint32_t J3Object::hashCode() { From gael.thomas at lip6.fr Wed Feb 5 08:01:11 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Wed, 05 Feb 2014 16:01:11 -0000 Subject: [vmkit-commits] [vmkit] r200847 - Monitor enter and monitor exit are now instance methods. Message-ID: <20140205160111.E30882A6C04B@llvm.org> Author: gthomas Date: Wed Feb 5 10:01:11 2014 New Revision: 200847 URL: http://llvm.org/viewvc/llvm-project?rev=200847&view=rev Log: Monitor enter and monitor exit are now instance methods. Modified: vmkit/branches/mcjit/include/j3/j3meta.def vmkit/branches/mcjit/include/j3/j3object.h vmkit/branches/mcjit/lib/j3/vm/j3object.cc Modified: vmkit/branches/mcjit/include/j3/j3meta.def URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=200847&r1=200846&r2=200847&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3meta.def (original) +++ vmkit/branches/mcjit/include/j3/j3meta.def Wed Feb 5 10:01:11 2014 @@ -4,8 +4,8 @@ _x(funcJ3TypeJavaClass, "j3: _x(funcJniEnv, "j3::J3::jniEnv()", 0) _x(funcJ3ArrayObjectMultianewArray, "j3::J3ArrayObject::multianewArray(j3::J3ArrayClass*, unsigned int, unsigned int*)", 0) _x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)", 0) -_x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*, j3::J3LockRecord*)", 0) -_x(funcJ3ObjectMonitorExit, "j3::J3Object::monitorExit(j3::J3Object*)", 0) +_x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3LockRecord*)", 0) +_x(funcJ3ObjectMonitorExit, "j3::J3Object::monitorExit()", 0) _x(funcThrowException, "vmkit::VMKit::throwException(void*)", 0) _x(funcReplayException, "j3::J3Thread::replayException()", 0) _x(funcClassCastException, "j3::J3::classCastException()", 0) Modified: vmkit/branches/mcjit/include/j3/j3object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=200847&r1=200846&r2=200847&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3object.h (original) +++ vmkit/branches/mcjit/include/j3/j3object.h Wed Feb 5 10:01:11 2014 @@ -122,8 +122,8 @@ namespace j3 { static J3LockRecord* asLockRecord(uintptr_t header) { return (J3LockRecord*)header; } static J3Monitor* asMonitor(uintptr_t header) { return (J3Monitor*)(header & ~3); } - static void monitorEnter(J3Object* object, J3LockRecord* lockRecord) __attribute__((always_inline)); - static void monitorExit(J3Object* object) __attribute__((always_inline)); + void monitorEnter(J3LockRecord* lockRecord) __attribute__((always_inline)); + void monitorExit() __attribute__((always_inline)); static J3Object* allocate(J3VirtualTable* vt, uintptr_t n); static J3Object* doNew(J3Class* cl); Modified: vmkit/branches/mcjit/lib/j3/vm/j3object.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3object.cc?rev=200847&r1=200846&r2=200847&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Wed Feb 5 10:01:11 2014 @@ -287,9 +287,8 @@ J3Object* J3Object::doNew(J3Class* cl) { return allocate(cl->vt(), cl->structSize()); } -void J3Object::monitorEnter(J3Object* obj, J3LockRecord* newRecord) { - volatile uintptr_t* pheader = &obj->_header; - uintptr_t header = *pheader; +void J3Object::monitorEnter(J3LockRecord* newRecord) { + uintptr_t header = _header; if(isStackLocked(header)) { J3LockRecord* record = asLockRecord(header); @@ -300,27 +299,26 @@ void J3Object::monitorEnter(J3Object* ob } else if(isUnlocked(header)) { newRecord->header = header; newRecord->lockCount = 1; - if(__sync_val_compare_and_swap(pheader, header, (uintptr_t)newRecord) == header) + if(__sync_val_compare_and_swap(&_header, header, (uintptr_t)newRecord) == header) return; } - obj->inflate()->lock(); + inflate()->lock(); } -void J3Object::monitorExit(J3Object* obj) { - volatile uintptr_t* pheader = &obj->_header; - uintptr_t header = *pheader; +void J3Object::monitorExit() { + uintptr_t header = _header; if(isStackLocked(header)) { J3LockRecord* record = asLockRecord(header); if(vmkit::Thread::get(record) == vmkit::Thread::get()) { if(!--record->lockCount) { - if(__sync_val_compare_and_swap(pheader, header, record->header) == header) + if(__sync_val_compare_and_swap(&_header, header, record->header) == header) return; } else return; } } - obj->inflate()->unlock(); + inflate()->unlock(); } uint32_t J3Object::hashCode() { From gael.thomas at lip6.fr Wed Feb 5 08:05:55 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Wed, 05 Feb 2014 16:05:55 -0000 Subject: [vmkit-commits] [vmkit] r200848 - Remove the useless j3thread::get(void*) function Message-ID: <20140205160555.259052A6C04B@llvm.org> Author: gthomas Date: Wed Feb 5 10:05:54 2014 New Revision: 200848 URL: http://llvm.org/viewvc/llvm-project?rev=200848&view=rev Log: Remove the useless j3thread::get(void*) function Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/include/j3/j3meta.def vmkit/branches/mcjit/include/j3/j3monitor.h vmkit/branches/mcjit/include/j3/j3thread.h vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3monitor.cc vmkit/branches/mcjit/lib/j3/vm/j3object.cc vmkit/branches/mcjit/lib/j3/vm/j3thread.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=200848&r1=200847&r2=200848&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Wed Feb 5 10:05:54 2014 @@ -108,7 +108,6 @@ namespace j3 { llvm::Function* buildFunction(J3Method* method, bool isStub=1); llvm::Value* typeDescriptor(J3ObjectType* objectType, llvm::Type* type); - llvm::Value* spToCurrentThread(llvm::Value* sp); llvm::Value* currentThread(); llvm::Value* nullCheck(llvm::Value* obj); Modified: vmkit/branches/mcjit/include/j3/j3meta.def URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=200848&r1=200847&r2=200848&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3meta.def (original) +++ vmkit/branches/mcjit/include/j3/j3meta.def Wed Feb 5 10:05:54 2014 @@ -25,7 +25,6 @@ _x(funcCXAEndCatch, "__c _x(funcFake, "j3::J3::forceSymbolDefinition()", 0) _x(funcJ3ThreadGet, "j3::J3Thread::get()", 0) -_x(funcJ3ThreadGetP, "j3::J3Thread::get(void*)", 0) _x(funcVMKitThreadGet, "vmkit::Thread::get()", 0) _x(funcVMKitThreadGetP, "vmkit::Thread::get(void*)", 0) _x(funcJ3ThreadJniEnv, "j3::J3Thread::jniEnv()", 0) Modified: vmkit/branches/mcjit/include/j3/j3monitor.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3monitor.h?rev=200848&r1=200847&r2=200848&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3monitor.h (original) +++ vmkit/branches/mcjit/include/j3/j3monitor.h Wed Feb 5 10:05:54 2014 @@ -6,10 +6,10 @@ namespace vmkit { class BumpAllocator; + class Thread; } namespace j3 { - class J3Thread; class J3Object; class J3LockRecord; @@ -19,7 +19,7 @@ namespace j3 { J3Monitor* _next; - J3Thread* owner; + vmkit::Thread* owner; uint32_t lockCount; pthread_mutex_t mutex; pthread_cond_t cond; @@ -35,7 +35,7 @@ namespace j3 { J3Monitor* prepare(J3Object* _object, uintptr_t header, J3LockRecord* _record); J3Monitor* prepare(); - bool isOwner(J3Thread* thread); + bool isOwner(vmkit::Thread* thread); void lock(); void unlock(); Modified: vmkit/branches/mcjit/include/j3/j3thread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3thread.h?rev=200848&r1=200847&r2=200848&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3thread.h (original) +++ vmkit/branches/mcjit/include/j3/j3thread.h Wed Feb 5 10:05:54 2014 @@ -68,7 +68,6 @@ namespace j3 { JavaVM* javaVM() { return &_javaVM; } static J3Thread* get(); - static J3Thread* get(void* ptr); static void start(J3ObjectHandle* handle); }; Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=200848&r1=200847&r2=200848&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Wed Feb 5 10:05:54 2014 @@ -227,12 +227,6 @@ llvm::Value* J3CodeGen::typeDescriptor(J return type == vm->typeJ3ObjectTypePtr ? v : builder.CreateBitCast(v, type); } -llvm::Value* J3CodeGen::spToCurrentThread(llvm::Value* sp) { - if(sp->getType()->isIntegerTy()) - sp = builder.CreateIntToPtr(sp, funcJ3ThreadGetP->getFunctionType()->getParamType(0)); - return builder.CreateCall(funcJ3ThreadGetP, sp); -} - llvm::Value* J3CodeGen::currentThread() { return builder.CreateCall(funcJ3ThreadGet); } Modified: vmkit/branches/mcjit/lib/j3/vm/j3monitor.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3monitor.cc?rev=200848&r1=200847&r2=200848&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3monitor.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3monitor.cc Wed Feb 5 10:05:54 2014 @@ -20,7 +20,7 @@ J3Monitor* J3Monitor::prepare(J3Object* object = _object; record = _record; header = _header; - owner = _record ? J3Thread::get(_record) : 0; + owner = _record ? vmkit::Thread::get(_record) : 0; return this; } @@ -35,7 +35,7 @@ void J3Monitor::checkRecord() { } } -bool J3Monitor::isOwner(J3Thread* thread) { +bool J3Monitor::isOwner(vmkit::Thread* thread) { return owner == thread; } Modified: vmkit/branches/mcjit/lib/j3/vm/j3object.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3object.cc?rev=200848&r1=200847&r2=200848&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Wed Feb 5 10:05:54 2014 @@ -388,13 +388,13 @@ J3Monitor* J3Object::inflate() { } bool J3Object::isLockOwner() { - J3Thread* self = J3Thread::get(); + vmkit::Thread* self = vmkit::Thread::get(); uintptr_t header = _header; if(isInflated(header)) /* inflated */ return asMonitor(header)->isOwner(self); else - return !isUnlocked(header) && (J3Thread*)J3Thread::get((void*)header) == self; + return !isUnlocked(header) && vmkit::Thread::get((void*)header) == self; } /* Modified: vmkit/branches/mcjit/lib/j3/vm/j3thread.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3thread.cc?rev=200848&r1=200847&r2=200848&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3thread.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3thread.cc Wed Feb 5 10:05:54 2014 @@ -95,10 +95,6 @@ void J3Thread::restore(J3ObjectHandle* p _localReferences.restore(ptr); } -J3Thread* J3Thread::get(void* ptr) { - return (J3Thread*)Thread::get(ptr); -} - J3Thread* J3Thread::get() { return (J3Thread*)Thread::get(); } From gael.thomas at lip6.fr Wed Feb 5 08:38:29 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Wed, 05 Feb 2014 16:38:29 -0000 Subject: [vmkit-commits] [vmkit] r200851 - Cleanup the code. Message-ID: <20140205163829.946AA2A6C04C@llvm.org> Author: gthomas Date: Wed Feb 5 10:38:29 2014 New Revision: 200851 URL: http://llvm.org/viewvc/llvm-project?rev=200851&view=rev Log: Cleanup the code. Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/include/j3/j3object.h vmkit/branches/mcjit/include/vmkit/thread.h vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc vmkit/branches/mcjit/lib/vmkit/inliner.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=200851&r1=200850&r2=200851&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Wed Feb 5 10:38:29 2014 @@ -132,7 +132,6 @@ namespace j3 { void monitorExit(llvm::Value* obj); llvm::CallInst* isAssignableTo(llvm::Value* obj, J3ObjectType* type); - void inlineCall(llvm::CallInst* call); void instanceof(llvm::Value* obj, J3ObjectType* type); void checkCast(llvm::Value* obj, J3ObjectType* type); @@ -177,7 +176,6 @@ namespace j3 { void selectExceptionNode(uint32_t idx); void translate(); - void z_translate(); void initExceptionNode(J3ExceptionNode** pnode, uint32_t pc, J3ExceptionNode* node); void addToExceptionNode(J3ExceptionNode* node, J3ExceptionEntry* entry); Modified: vmkit/branches/mcjit/include/j3/j3object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=200851&r1=200850&r2=200851&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3object.h (original) +++ vmkit/branches/mcjit/include/j3/j3object.h Wed Feb 5 10:38:29 2014 @@ -112,18 +112,17 @@ namespace j3 { J3Object(); /* never directly allocate an object */ + static bool isUnlocked(uintptr_t header) __attribute__((always_inline)) { return (header & 7) == 1; } + static bool isInflated(uintptr_t header) __attribute__((always_inline)) { return (header & 3) == 2; } + static bool isStackLocked(uintptr_t header) __attribute__((always_inline)) { return !(header & 3); } + static J3LockRecord* asLockRecord(uintptr_t header) __attribute__((always_inline)) { return (J3LockRecord*)header; } + static J3Monitor* asMonitor(uintptr_t header) __attribute__((always_inline)) { return (J3Monitor*)(header & ~3); } + bool isLockOwner(); J3Monitor* inflate(); uint32_t hashCode(); - - static bool isUnlocked(uintptr_t header) { return (header & 7) == 1; } - static bool isInflated(uintptr_t header) { return (header & 3) == 2; } - static bool isStackLocked(uintptr_t header) { return !(header & 3); } - static J3LockRecord* asLockRecord(uintptr_t header) { return (J3LockRecord*)header; } - static J3Monitor* asMonitor(uintptr_t header) { return (J3Monitor*)(header & ~3); } - - void monitorEnter(J3LockRecord* lockRecord) __attribute__((always_inline)); - void monitorExit() __attribute__((always_inline)); + void monitorEnter(J3LockRecord* lockRecord) __attribute__((always_inline)); + void monitorExit() __attribute__((always_inline)); static J3Object* allocate(J3VirtualTable* vt, uintptr_t n); static J3Object* doNew(J3Class* cl); Modified: vmkit/branches/mcjit/include/vmkit/thread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/thread.h?rev=200851&r1=200850&r2=200851&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/thread.h (original) +++ vmkit/branches/mcjit/include/vmkit/thread.h Wed Feb 5 10:38:29 2014 @@ -33,9 +33,9 @@ namespace vmkit { VMKit* vm() { return _vm; } - static uintptr_t getThreadMask(); - static Thread* get(void* ptr); - static Thread* get(); + static uintptr_t getThreadMask() __attribute__((always_inline)); + static Thread* get(void* ptr) __attribute__((always_inline)); + static Thread* get() __attribute__((always_inline)); bool registerSignal(int n, sa_action_t handler); Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=200851&r1=200850&r2=200851&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Wed Feb 5 10:38:29 2014 @@ -357,7 +357,7 @@ void J3CodeGen::invokeVirtual(uint32_t i J3Method* target = cl->methodAt(idx, 0); if(J3Cst::isFinal(target->cl()->access()) || J3Cst::isFinal(target->cl()->access())) - invoke(0, target, buildFunction(target)); /* do not remove this optimization */ + invoke(0, target, buildFunction(target)); /* do not remove this optimization, mandatory for mmtk */ else { J3Signature* type = target->signature(); llvm::Value* funcEntry = funcEntry = builder.getInt32(target->index()); @@ -536,11 +536,6 @@ llvm::CallInst* J3CodeGen::isAssignableT vtType); } -void J3CodeGen::inlineCall(llvm::CallInst* call) { - //llvm::InlineFunctionInfo ifi; - //llvm::InlineFunction(call, ifi, 0); -} - void J3CodeGen::instanceof(llvm::Value* obj, J3ObjectType* type) { llvm::BasicBlock* after = forwardBranch("instanceof-after", codeReader->tell(), 0, 0); llvm::BasicBlock* nok = newBB("instanceof-null"); @@ -557,7 +552,6 @@ void J3CodeGen::instanceof(llvm::Value* llvm::CallInst* is = isAssignableTo(obj, type); stack.push(builder.CreateZExt(is, builder.getInt32Ty())); builder.CreateBr(after); - inlineCall(is); } void J3CodeGen::checkCast(llvm::Value* obj, J3ObjectType* type) { @@ -578,7 +572,6 @@ void J3CodeGen::checkCast(llvm::Value* o llvm::CallInst* is = isAssignableTo(obj, type); builder.CreateCondBr(is, succeed, bbCheckCastFailed); - inlineCall(is); } } @@ -1558,39 +1551,6 @@ void J3CodeGen::explore() { } #endif -void J3CodeGen::z_translate() { - bbRet = newBB("ret"); - llvm::BasicBlock* landingPad = newBB("landing-pad"); - llvm::Value* val = builder.CreateIntToPtr(llvm::ConstantInt::get(uintPtrTy, (uintptr_t)0x42), - vm->typeJ3ObjectPtr); - builder.CreateInvoke(funcThrowException, bbRet, landingPad, - builder.CreateBitCast(val, funcThrowException->getFunctionType()->getParamType(0))); - - builder.SetInsertPoint(landingPad); - llvm::LandingPadInst *caughtResult = builder.CreateLandingPad(vm->typeGXXException, - funcGXXPersonality, - 1, - "landing-pad"); - caughtResult->addClause(gvTypeInfo); - - llvm::Value* excp = builder.CreateBitCast(builder.CreateCall(funcCXABeginCatch, - builder.CreateExtractValue(caughtResult, 0)), - vm->typeJ3ObjectPtr); - - builder.CreateCall(funcCXAEndCatch); - - builder.CreateCall3(funcEchoDebugExecute, - builder.getInt32(-1), /* just to see my first exception :) */ - buildString("catching exception %p!\n"), - excp); - builder.CreateBr(bbRet); - - builder.SetInsertPoint(bbRet); - builder.CreateRetVoid(); - - llvmFunction->dump(); -} - void J3CodeGen::generateJava() { llvm::BasicBlock* entry = newBB("entry"); builder.SetInsertPoint(entry); Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc?rev=200851&r1=200850&r2=200851&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc Wed Feb 5 10:38:29 2014 @@ -59,7 +59,6 @@ void J3ExceptionNode::addEntry(J3CodeGen llvm::CallInst* is = codeGen->isAssignableTo(codeGen->stack.top(0), codeGen->cl->classAt(entry->catchType)); codeGen->builder.CreateCondBr(is, entry->bb, curCheck); - codeGen->inlineCall(is); } else { codeGen->builder.CreateBr(entry->bb); curCheck = 0; Modified: vmkit/branches/mcjit/lib/vmkit/inliner.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/inliner.cc?rev=200851&r1=200850&r2=200851&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/inliner.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/inliner.cc Wed Feb 5 10:38:29 2014 @@ -261,6 +261,6 @@ namespace vmkit { #endif llvm::FunctionPass* createFunctionInlinerPass(CompilationUnit* compiler, bool onlyAlwaysInline) { - return new FunctionInlinerPass(compiler, 25*256, onlyAlwaysInline); /* aka 25 instructions */ + return new FunctionInlinerPass(compiler, 50*256, onlyAlwaysInline); /* aka 50 llvm instructions */ } } From gael.thomas at lip6.fr Wed Feb 5 09:24:50 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Wed, 05 Feb 2014 17:24:50 -0000 Subject: [vmkit-commits] [vmkit] r200856 - Run the inlining pass even in AOT mode. Message-ID: <20140205172450.D24C02A6C04B@llvm.org> Author: gthomas Date: Wed Feb 5 11:24:50 2014 New Revision: 200856 URL: http://llvm.org/viewvc/llvm-project?rev=200856&view=rev Log: Run the inlining pass even in AOT mode. Modified: vmkit/branches/mcjit/include/j3/j3object.h vmkit/branches/mcjit/include/vmkit/compiler.h vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc vmkit/branches/mcjit/lib/vmkit/compiler.cc Modified: vmkit/branches/mcjit/include/j3/j3object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=200856&r1=200855&r2=200856&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3object.h (original) +++ vmkit/branches/mcjit/include/j3/j3object.h Wed Feb 5 11:24:50 2014 @@ -80,9 +80,9 @@ namespace j3 { uint32_t offset() { return checker.offset; } bool isPrimaryChecker() { return checker.offset < J3TypeChecker::cacheOffset; } - bool slowIsAssignableTo(J3VirtualTable* parent) __attribute__((always_inline)); - bool fastIsAssignableToPrimaryChecker(J3VirtualTable* parent, uint32_t parentOffset); - bool fastIsAssignableToNonPrimaryChecker(J3VirtualTable* parent); + bool slowIsAssignableTo(J3VirtualTable* parent) __attribute__((noinline)); + bool fastIsAssignableToPrimaryChecker(J3VirtualTable* parent, uint32_t parentOffset) __attribute__((always_inline)); + bool fastIsAssignableToNonPrimaryChecker(J3VirtualTable* parent) __attribute__((noinline)); bool isAssignableTo(J3VirtualTable* parent); J3Type* type() const { return _type; } Modified: vmkit/branches/mcjit/include/vmkit/compiler.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/compiler.h?rev=200856&r1=200855&r2=200856&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/compiler.h (original) +++ vmkit/branches/mcjit/include/vmkit/compiler.h Wed Feb 5 11:24:50 2014 @@ -73,6 +73,7 @@ namespace vmkit { BumpAllocator* allocator() { return _allocator; } llvm::ExecutionEngine* ee() { return _ee; } + void prepareModule(llvm::Module* module); void compileModule(llvm::Module* module); }; } Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=200856&r1=200855&r2=200856&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Wed Feb 5 11:24:50 2014 @@ -118,6 +118,8 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato llvmFunction->dump(); } + loader->prepareModule(module); + uint32_t needsCaller = withCaller() && !signature->caller(access); if(needsCaller) Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc?rev=200856&r1=200855&r2=200856&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc Wed Feb 5 11:24:50 2014 @@ -51,9 +51,9 @@ void J3ExceptionNode::addEntry(J3CodeGen if(curCheck) { /* = 0 if I already have a finally */ codeGen->builder.SetInsertPoint(curCheck); - curCheck = codeGen->newBB("next-exception-check"); if(entry->catchType) { + curCheck = codeGen->newBB("next-exception-check"); codeGen->stack.metaStack[0] = codeGen->vm->typeJ3ObjectPtr; codeGen->stack.topStack = 1; llvm::CallInst* is = codeGen->isAssignableTo(codeGen->stack.top(0), Modified: vmkit/branches/mcjit/lib/j3/vm/j3method.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3method.cc?rev=200856&r1=200855&r2=200856&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Wed Feb 5 11:24:50 2014 @@ -52,7 +52,7 @@ vmkit::CompilationUnit* J3Method::unit() } uint64_t J3Method::inlineWeight() { - if(1 && J3Thread::get()->vm()->options()->enableInlining) + if(J3Thread::get()->vm()->options()->enableInlining) return vmkit::Symbol::inlineWeight(); else return (uint64_t)-1; Modified: vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc?rev=200856&r1=200855&r2=200856&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc (original) +++ vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc Wed Feb 5 11:24:50 2014 @@ -39,14 +39,14 @@ namespace { for(llvm::Module::global_iterator it = module.global_begin(); it!=module.global_end(); it++) { llvm::GlobalValue* gv = it; - fprintf(stderr, "Global: %s\n", gv->getName().data()); + //fprintf(stderr, "Global: %s\n", gv->getName().data()); } for(llvm::Module::iterator it = module.begin(); it!=module.end(); it++) { llvm::Function* function = it; - if(!strncmp(function->getName().data(), "j3_java", 7)) - fprintf(stderr, "processing %s\n", function->getName().data()); + //if(!strncmp(function->getName().data(), "j3_java", 7)) + //fprintf(stderr, "processing %s\n", function->getName().data()); } return Changed; Modified: vmkit/branches/mcjit/lib/vmkit/compiler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/compiler.cc?rev=200856&r1=200855&r2=200856&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/compiler.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/compiler.cc Wed Feb 5 11:24:50 2014 @@ -88,9 +88,10 @@ CompilationUnit::CompilationUnit(BumpAll if(runInlinePass || onlyAlwaysInline) pm->add(vmkit::createFunctionInlinerPass(this, onlyAlwaysInline)); + +#if 0 pm->add(llvm::createCFGSimplificationPass()); // Clean up disgusting code -#if 1 pm->add(llvm::createPromoteMemoryToRegisterPass());// Kill useless allocas pm->add(llvm::createInstructionCombiningPass()); // Cleanup for scalarrepl. pm->add(llvm::createScalarReplAggregatesPass()); // Break up aggregate allocas @@ -170,8 +171,11 @@ uint64_t CompilationUnit::getSymbolAddre return (uint64_t)(uintptr_t)getSymbol(System::mcjitSymbol(Name.c_str()))->getSymbolAddress(); } -void CompilationUnit::compileModule(llvm::Module* module) { +void CompilationUnit::prepareModule(llvm::Module* module) { pm->run(*module); +} + +void CompilationUnit::compileModule(llvm::Module* module) { ee()->addModule(module); ee()->finalizeObject();