[vmkit-commits] vmkit-commits Digest, Vol 28, Issue 2

nicolas geoffray nicolas.geoffray at gmail.com
Thu Sep 16 12:46:52 PDT 2010


Hi Richard,

This should be fixed in latest svn. Thanks for reporting!

Cheers,
Nicolas

On Wed, Sep 15, 2010 at 4:37 PM, Allan Tong <actong88 at gmail.com> wrote:

> The attached patch should fix your issue, though it was actually
> created to get around another problem, that being that r109973 caused
> the mmtk/llvm-gcc build to fail due to the use of gc_root from
> ForceRuntimeLinking.
>
> Alternatively you could just remove references to j3OverflowThinLock,
> which was removed by r111784, from LinkJavaRuntime.h
>
>  - Allan
>
> On Tue, Sep 14, 2010 at 5:27 PM, Richard Corsale <igf1 at yahoo.com> wrote:
> > Hi all, I seem to get this error when running make:
> >
> > llvm[1]: Linking Debug+Asserts executable vmjc
> > /media/tank/Downloads/VMKit/vmkit/Debug+Asserts/lib/libJ3.a(Jnjvm.o): In
> > function `ForceRuntimeLinking':
> > /media/tank/Downloads/VMKit/vmkit/lib/J3/VMCore/LinkJavaRuntime.h:108:
> undefined
> > reference to `j3OverflowThinLock'
> > collect2: ld returned 1 exit status
> > make[1]: *** [/media/tank/Downloads/VMKit/vmkit/Debug+Asserts/bin/vmjc]
> Error 1
> > make[1]: Leaving directory `/media/tank/Downloads/VMKit/vmkit/tools/vmjc'
> > make: *** [all] Error 1
> >
> >
> > I any idea what's going on?
> >
> >
> >
> > ----- Original Message ----
> > From: "vmkit-commits-request at cs.uiuc.edu" <
> vmkit-commits-request at cs.uiuc.edu>
> > To: vmkit-commits at cs.uiuc.edu
> > Sent: Sun, September 12, 2010 1:00:07 PM
> > Subject: vmkit-commits Digest, Vol 28, Issue 2
> >
> > Send vmkit-commits mailing list submissions to
> >    vmkit-commits at cs.uiuc.edu
> >
> > To subscribe or unsubscribe via the World Wide Web, visit
> >    http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits
> > or, via email, send a message with subject or body 'help' to
> >    vmkit-commits-request at cs.uiuc.edu
> >
> > You can reach the person managing the list at
> >    vmkit-commits-owner at cs.uiuc.edu
> >
> > When replying, please edit your Subject line so it is more specific
> > than "Re: Contents of vmkit-commits digest..."
> >
> >
> > Today's Topics:
> >
> >   1. [vmkit] r113706 - in /vmkit/branches/precise:
> >      include/mvm/JIT.h include/mvm/MethodInfo.h
> >      include/mvm/VirtualMachine.h lib/J3/Compiler/JavaJITCompiler.cpp
> >      lib/J3/Compiler/LLVMInfo.cpp lib/J3/VMCore/JavaClass.h
> >      lib/J3/VMCore/Jnjvm.cpp lib/J3/VMCore/JnjvmClassLoader.cpp
> >      lib/Mvm/Compiler/JIT.cpp lib/Mvm/Runtime/MethodInfo.cpp
> >      (Nicolas Geoffray)
> >
> >
> > ----------------------------------------------------------------------
> >
> > Message: 1
> > Date: Sat, 11 Sep 2010 22:33:49 -0000
> > From: Nicolas Geoffray <nicolas.geoffray at lip6.fr>
> > Subject: [vmkit-commits] [vmkit] r113706 - in /vmkit/branches/precise:
> >    include/mvm/JIT.h include/mvm/MethodInfo.h
> >    include/mvm/VirtualMachine.h lib/J3/Compiler/JavaJITCompiler.cpp
> >    lib/J3/Compiler/LLVMInfo.cpp lib/J3/VMCore/JavaClass.h
> >    lib/J3/VMCore/Jnjvm.cpp lib/J3/VMCore/JnjvmClassLoader.cpp
> >    lib/Mvm/Compiler/JIT.cpp lib/Mvm/Runtime/MethodInfo.cpp
> > To: vmkit-commits at cs.uiuc.edu
> > Message-ID: <20100911223349.47BDA2A6C12C at llvm.org>
> > Content-Type: text/plain; charset="utf-8"
> >
> > Author: geoffray
> > Date: Sat Sep 11 17:33:49 2010
> > New Revision: 113706
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=113706&view=rev
> > Log:
> > Have  a single function map per vm, and put exact ip information in it.
> >
> >
> > Modified:
> >    vmkit/branches/precise/include/mvm/JIT.h
> >    vmkit/branches/precise/include/mvm/MethodInfo.h
> >    vmkit/branches/precise/include/mvm/VirtualMachine.h
> >    vmkit/branches/precise/lib/J3/Compiler/JavaJITCompiler.cpp
> >    vmkit/branches/precise/lib/J3/Compiler/LLVMInfo.cpp
> >    vmkit/branches/precise/lib/J3/VMCore/JavaClass.h
> >    vmkit/branches/precise/lib/J3/VMCore/Jnjvm.cpp
> >    vmkit/branches/precise/lib/J3/VMCore/JnjvmClassLoader.cpp
> >    vmkit/branches/precise/lib/Mvm/Compiler/JIT.cpp
> >    vmkit/branches/precise/lib/Mvm/Runtime/MethodInfo.cpp
> >
> > Modified: vmkit/branches/precise/include/mvm/JIT.h
> > URL:
> >
> http://llvm.org/viewvc/llvm-project/vmkit/branches/precise/include/mvm/JIT.h?rev=113706&r1=113705&r2=113706&view=diff
> >
> >
> ==============================================================================
> > --- vmkit/branches/precise/include/mvm/JIT.h (original)
> > +++ vmkit/branches/precise/include/mvm/JIT.h Sat Sep 11 17:33:49 2010
> > @@ -30,6 +30,7 @@
> >   class FunctionPassManager;
> >   class GCFunctionInfo;
> >   class GCStrategy;
> > +  class JIT;
> >   class Module;
> >   class PointerType;
> >   class TargetData;
> > @@ -176,15 +177,13 @@
> >
> >
> > class MvmModule {
> > -private:
> > -   static llvm::ExecutionEngine* executionEngine;
> > -
> > public:
> >    static llvm::GCStrategy* TheGCStrategy;
> >    static mvm::LockRecursive protectEngine;
> >    static llvm::Module *globalModule;
> >    static const llvm::TargetData* TheTargetData;
> >    static mvm::BumpPtrAllocator* Allocator;
> > +   static llvm::ExecutionEngine* executionEngine;
> >    //static unsigned MetadataTypeKind;
> >
> >    static uint64 getTypeSize(const llvm::Type* type);
> > @@ -209,6 +208,7 @@
> > public:
> >   virtual void scan(uintptr_t closure, void* ip, void* addr);
> >   JITMethodInfo(llvm::GCFunctionInfo* GFI) : GCInfo(GFI) {}
> > +  void addToVM(VirtualMachine* vm, llvm::JIT* jit);
> > };
> >
> > class MvmJITMethodInfo : public JITMethodInfo {
> >
> > Modified: vmkit/branches/precise/include/mvm/MethodInfo.h
> > URL:
> >
> http://llvm.org/viewvc/llvm-project/vmkit/branches/precise/include/mvm/MethodInfo.h?rev=113706&r1=113705&r2=113706&view=diff
> >
> >
> ==============================================================================
> > --- vmkit/branches/precise/include/mvm/MethodInfo.h (original)
> > +++ vmkit/branches/precise/include/mvm/MethodInfo.h Sat Sep 11 17:33:49
> 2010
> > @@ -29,7 +29,6 @@
> >   void* getMetaInfo() const { return MetaInfo; }
> >
> >   unsigned MethodType;
> > -  void* InstructionPointer;
> >   void* MetaInfo;
> > };
> >
> > @@ -45,15 +44,15 @@
> > public:
> >   CamlFrame* CF;
> >   virtual void scan(uintptr_t closure, void* ip, void* addr);
> > -  CamlMethodInfo(CamlFrame* C, void* ip);
> > +  CamlMethodInfo(CamlFrame* C) : CF(C) { }
> > };
> >
> > class StaticCamlMethodInfo : public CamlMethodInfo {
> >   const char* name;
> > public:
> >   virtual void print(void* ip, void* addr);
> > -  StaticCamlMethodInfo(CamlFrame* CF, void* ip, const char* n) :
> > -    CamlMethodInfo(CF, ip) {
> > +  StaticCamlMethodInfo(CamlFrame* CF, const char* n) :
> > +    CamlMethodInfo(CF) {
> >     name = n;
> >     MethodType = 0;
> >   }
> >
> > Modified: vmkit/branches/precise/include/mvm/VirtualMachine.h
> > URL:
> >
> http://llvm.org/viewvc/llvm-project/vmkit/branches/precise/include/mvm/VirtualMachine.h?rev=113706&r1=113705&r2=113706&view=diff
> >
> >
> ==============================================================================
> > --- vmkit/branches/precise/include/mvm/VirtualMachine.h (original)
> > +++ vmkit/branches/precise/include/mvm/VirtualMachine.h Sat Sep 11
> 17:33:49 2010
> > @@ -48,79 +48,16 @@
> >
> >   /// IPToMethodInfo - Map a code start instruction instruction to the
> > MethodInfo.
> >   ///
> > -  MethodInfo* CodeStartToMethodInfo(void* ip) {
> > -    FunctionMapLock.acquire();
> > -    std::map<void*, MethodInfo*>::iterator I = Functions.find(ip);
> > -    MethodInfo* res = NULL;
> > -    if (I != Functions.end()) {
> > -      res = I->second;
> > -    }
> > -    FunctionMapLock.release();
> > -    return res;
> > -  }
> > -};
> > -
> > -/// StartEndFunctionMap - This map is for functions for which we have
> > -/// a start and end address.
> > -///
> > -class StartEndFunctionMap : public FunctionMap {
> > -public:
> > -  /// addMethodInFunctionMap - A new method pointer in the function map.
> > -  ///
> > -  void addMethodInfo(MethodInfo* meth, void* start, void* end) {
> > -    FunctionMapLock.acquire();
> > -    Functions.insert(std::make_pair(start, meth));
> > -    Functions.insert(std::make_pair(end, meth));
> > -    FunctionMapLock.release();
> > -  }
> > -
> > -  /// IPToMethodInfo - Map an instruction pointer to the MethodInfo.
> > -  ///
> > -  MethodInfo* IPToMethodInfo(void* ip) {
> > -    FunctionMapLock.acquire();
> > -    std::map<void*, MethodInfo*>::iterator I =
> Functions.upper_bound(ip);
> > -    MethodInfo* res = 0;
> > -    if (I != Functions.end() && I != Functions.begin()) {
> > -      res = I->second;
> > -      if ((--I)->second != res) res = 0;
> > -    }
> > -    FunctionMapLock.release();
> > -    return res;
> > -  }
> > -};
> > -
> > -/// StartFunctionMap - This map is for static functions where getting an
> end
> > -/// address is cumbersome.
> > -///
> > -class StartFunctionMap : public FunctionMap {
> > -public:
> > -  /// addMethodInFunctionMap - A new method pointer in the function map.
> > -  ///
> > -  void addMethodInfo(MethodInfo* meth, void* addr) {
> > -    FunctionMapLock.acquire();
> > -    Functions.insert(std::make_pair((void*)addr, meth));
> > -    FunctionMapLock.release();
> > -  }
> > -
> > -  /// IPToMethodInfo - Map an instruction pointer to the MethodInfo.
> > -  ///
> >   MethodInfo* IPToMethodInfo(void* ip);
> > -
> > -};
> >
> > -class SharedStartFunctionMap : public StartFunctionMap {
> > -public:
> > -  BumpPtrAllocator* StaticAllocator;
> > -  bool initialized;
> > -  SharedStartFunctionMap() {
> > -    initialized = false;
> > -  }
> > +  /// addMethodInfo - A new instruction pointer in the function map.
> > +  ///
> > +  void addMethodInfo(MethodInfo* meth, void* ip);
> >
> > -  void initialize();
> > +  FunctionMap();
> > };
> >
> >
> > -
> > // Same values than JikesRVM
> > #define INITIAL_QUEUE_SIZE 256
> > #define GROW_FACTOR 2
> > @@ -232,7 +169,6 @@
> >
> >     mainThread = 0;
> >     NumberOfThreads = 0;
> > -    if (!SharedStaticFunctions.initialized)
> SharedStaticFunctions.initialize();
> >   }
> > public:
> >
> > @@ -529,13 +465,10 @@
> >   UncooperativeCollectionRV rendezvous;
> > #endif
> >
> > -
> > -  StartEndFunctionMap RuntimeFunctions;
> > -  static StartEndFunctionMap SharedRuntimeFunctions;
> > -  StartFunctionMap StaticFunctions;
> > -  static SharedStartFunctionMap SharedStaticFunctions;
> > -
> > -  MethodInfo* IPToMethodInfo(void* ip);
> > +  FunctionMap FunctionsCache;
> > +  MethodInfo* IPToMethodInfo(void* ip) {
> > +    return FunctionsCache.IPToMethodInfo(ip);
> > +  }
> >
> > #ifdef ISOLATE
> >   size_t IsolateID;
> >
> > Modified: vmkit/branches/precise/lib/J3/Compiler/JavaJITCompiler.cpp
> > URL:
> >
> http://llvm.org/viewvc/llvm-project/vmkit/branches/precise/lib/J3/Compiler/JavaJITCompiler.cpp?rev=113706&r1=113705&r2=113706&view=diff
> >
> >
> ==============================================================================
> > --- vmkit/branches/precise/lib/J3/Compiler/JavaJITCompiler.cpp (original)
> > +++ vmkit/branches/precise/lib/J3/Compiler/JavaJITCompiler.cpp Sat Sep 11
> > 17:33:49 2010
> > @@ -55,10 +55,16 @@
> >   if (ip) new_ip = isStub(ip, addr);
> >   JavaMethod* meth = (JavaMethod*)MetaInfo;
> >   CodeLineInfo* info = meth->lookupCodeLineInfo((uintptr_t)ip);
> > -  fprintf(stderr, "; %p in %s.%s (line %d, bytecode %d, code start %p)",
> > new_ip,
> > -          UTF8Buffer(meth->classDef->name).cString(),
> > -          UTF8Buffer(meth->name).cString(), info->lineNumber,
> > -          info->bytecodeIndex, meth->code);
> > +  if (info != NULL) {
> > +    fprintf(stderr, "; %p in %s.%s (line %d, bytecode %d, code start
> %p)",
> > new_ip,
> > +            UTF8Buffer(meth->classDef->name).cString(),
> > +            UTF8Buffer(meth->name).cString(), info->lineNumber,
> > +            info->bytecodeIndex, meth->code);
> > +  } else {
> > +    fprintf(stderr, "; %p in %s.%s (native method, code start %p)",
> new_ip,
> > +            UTF8Buffer(meth->classDef->name).cString(),
> > +            UTF8Buffer(meth->name).cString(), meth->code);
> > +  }
> >   if (ip != new_ip) fprintf(stderr, " (from stub)");
> >   fprintf(stderr, "\n");
> > }
> > @@ -71,41 +77,39 @@
> >   // The following could be changed to an assert when -load-bc supports
> >   // the verifier.
> >   if (F.getParent() != TheCompiler->getLLVMModule()) return;
> > +  assert(F.hasGC());
> >
> >   Jnjvm* vm = JavaThread::get()->getJVM();
> >   mvm::BumpPtrAllocator& Alloc = TheCompiler->allocator;
> > -  llvm::GCFunctionInfo* GFI = 0;
> >
> > -  if (F.hasGC()) {
> > -    if (TheCompiler->TheGCStrategy == NULL) {
> > -      assert(mvm::MvmModule::TheGCStrategy != NULL && "No GC strategy");
> > -      TheCompiler->TheGCStrategy = mvm::MvmModule::TheGCStrategy;
> > -      mvm::MvmModule::TheGCStrategy = NULL;
> > -    }
> > -    GCStrategy::iterator I = TheCompiler->TheGCStrategy->end();
> > +  // Fetch the GCStrategy if it wasn't created before.
> > +  if (TheCompiler->TheGCStrategy == NULL) {
> > +    assert(mvm::MvmModule::TheGCStrategy != NULL && "No GC strategy");
> > +    TheCompiler->TheGCStrategy = mvm::MvmModule::TheGCStrategy;
> > +    mvm::MvmModule::TheGCStrategy = NULL;
> > +  }
> > +
> > +  GCStrategy::iterator I = TheCompiler->TheGCStrategy->end();
> > +  I--;
> > +  while (&(*I)->getFunction() != &F) {
> > +    // This happens when the compilation of a function was post-poned.
> > +    assert(I != TheCompiler->TheGCStrategy->begin() && "No GC info");
> >     I--;
> > -    while (&(*I)->getFunction() != &F) {
> > -      // This happens when the compilation of a function was post-poned.
> > -      assert(I != TheCompiler->TheGCStrategy->begin() && "No GC info");
> > -      I--;
> > -    }
> > -    assert(&(*I)->getFunction() == &F &&
> > -        "GC Info and method do not correspond");
> > -    GFI = *I;
> >   }
> > +  assert(&(*I)->getFunction() == &F && "GC Info and method do not
> correspond");
> > +  llvm::GCFunctionInfo* GFI = *I;
> >
> >   JavaMethod* meth = TheCompiler->getJavaMethod(F);
> > +  mvm::JITMethodInfo* MI = NULL;
> >   if (meth == NULL) {
> >     // This is a stub.
> > -    mvm::MvmJITMethodInfo* MI = new(Alloc, "JITMethodInfo")
> > -      mvm::MvmJITMethodInfo(GFI, &F);
> > -    vm->RuntimeFunctions.addMethodInfo(MI, Code,
> > -                                       (void*)((uintptr_t)Code + Size));
> > +    MI = new(Alloc, "JITMethodInfo") mvm::MvmJITMethodInfo(GFI, &F);
> >   } else {
> > -    JavaJITMethodInfo* MI = new(Alloc, "JavaJITMethodInfo")
> > -      JavaJITMethodInfo(GFI, meth);
> > -    vm->RuntimeFunctions.addMethodInfo(MI, Code,
> > -                                       (void*)((uintptr_t)Code + Size));
> > +    MI = new(Alloc, "JavaJITMethodInfo") JavaJITMethodInfo(GFI, meth);
> > +  }
> > +  MI->addToVM(vm, (JIT*)TheCompiler->executionEngine);
> > +
> > +  if (meth != NULL) {
> >     uint32 infoLength = Details.LineStarts.size();
> >     meth->codeInfoLength = infoLength;
> >     if (infoLength > 0) {
> >
> > Modified: vmkit/branches/precise/lib/J3/Compiler/LLVMInfo.cpp
> > URL:
> >
> http://llvm.org/viewvc/llvm-project/vmkit/branches/precise/lib/J3/Compiler/LLVMInfo.cpp?rev=113706&r1=113705&r2=113706&view=diff
> >
> >
> ==============================================================================
> > --- vmkit/branches/precise/lib/J3/Compiler/LLVMInfo.cpp (original)
> > +++ vmkit/branches/precise/lib/J3/Compiler/LLVMInfo.cpp Sat Sep 11
> 17:33:49 2010
> > @@ -169,9 +169,7 @@
> >                                         "", Compiler->getLLVMModule());
> >     }
> >
> > -    if (Compiler->useCooperativeGC()) {
> > -      methodFunction->setGC("vmkit");
> > -    }
> > +    methodFunction->setGC("vmkit");
> >
> >     Compiler->functions.insert(std::make_pair(methodFunction,
> methodDef));
> >     if (Compiler != JCL->getCompiler() && methodDef->code) {
> > @@ -404,10 +402,13 @@
> >
> >   Value* val = CallInst::Create(func, Args.begin(), Args.end(), "",
> >                                 currentBlock);
> > -  if (!signature->getReturnType()->isVoid())
> > +  if (!signature->getReturnType()->isVoid()) {
> >     ReturnInst::Create(context, val, currentBlock);
> > -  else
> > +  } else {
> >     ReturnInst::Create(context, currentBlock);
> > +  }
> > +
> > +  res->setGC("vmkit");
> >
> >   return res;
> > }
> > @@ -481,15 +482,14 @@
> >
> >   Value* val = CallInst::Create(func, Args.begin(), Args.end(), "",
> >                                 currentBlock);
> > -  if (!signature->getReturnType()->isVoid())
> > +  if (!signature->getReturnType()->isVoid()) {
> >     ReturnInst::Create(context, val, currentBlock);
> > -  else
> > +  } else {
> >     ReturnInst::Create(context, currentBlock);
> > -
> > -  if (Compiler->useCooperativeGC()) {
> > -    res->setGC("vmkit");
> >   }
> >
> > +  res->setGC("vmkit");
> > +
> >   return res;
> > }
> >
> > @@ -545,7 +545,7 @@
> >   if (virt) {
> >     if (Compiler->useCooperativeGC()) {
> >       Args.push_back(new LoadInst(TempArgs[0], "", false, currentBlock));
> > -    }else {
> > +    } else {
> >       Args.push_back(TempArgs[0]);
> >     }
> >   }
> > @@ -587,9 +587,7 @@
> >     ReturnInst::Create(context, currentBlock);
> >   }
> >
> > -  if (Compiler->useCooperativeGC()) {
> > -    stub->setGC("vmkit");
> > -  }
> > +  stub->setGC("vmkit");
> >
> >   return stub;
> > }
> >
> > Modified: vmkit/branches/precise/lib/J3/VMCore/JavaClass.h
> > URL:
> >
> http://llvm.org/viewvc/llvm-project/vmkit/branches/precise/lib/J3/VMCore/JavaClass.h?rev=113706&r1=113705&r2=113706&view=diff
> >
> >
> ==============================================================================
> > --- vmkit/branches/precise/lib/J3/VMCore/JavaClass.h (original)
> > +++ vmkit/branches/precise/lib/J3/VMCore/JavaClass.h Sat Sep 11 17:33:49
> 2010
> > @@ -902,7 +902,7 @@
> >   virtual void print(void* ip, void* addr);
> >
> >   JavaStaticMethodInfo(mvm::CamlMethodInfo* super, void* ip, JavaMethod*
> M) :
> > -    mvm::CamlMethodInfo(super != NULL ? super->CF : NULL, ip) {
> > +    mvm::CamlMethodInfo(super->CF) {
> >     MetaInfo = M;
> >     MethodType = 1;
> >   }
> >
> > Modified: vmkit/branches/precise/lib/J3/VMCore/Jnjvm.cpp
> > URL:
> >
> http://llvm.org/viewvc/llvm-project/vmkit/branches/precise/lib/J3/VMCore/Jnjvm.cpp?rev=113706&r1=113705&r2=113706&view=diff
> >
> >
> ==============================================================================
> > --- vmkit/branches/precise/lib/J3/VMCore/Jnjvm.cpp (original)
> > +++ vmkit/branches/precise/lib/J3/VMCore/Jnjvm.cpp Sat Sep 11 17:33:49
> 2010
> > @@ -1487,8 +1487,7 @@
> > }
> >
> > void Jnjvm::removeMethodsInFunctionMaps(JnjvmClassLoader* loader) {
> > -  internalRemoveMethods(loader, RuntimeFunctions);
> > -  internalRemoveMethods(loader, StaticFunctions);
> > +  internalRemoveMethods(loader, FunctionsCache);
> > }
> >
> >
> >
> > Modified: vmkit/branches/precise/lib/J3/VMCore/JnjvmClassLoader.cpp
> > URL:
> >
> http://llvm.org/viewvc/llvm-project/vmkit/branches/precise/lib/J3/VMCore/JnjvmClassLoader.cpp?rev=113706&r1=113705&r2=113706&view=diff
> >
> >
> ==============================================================================
> > --- vmkit/branches/precise/lib/J3/VMCore/JnjvmClassLoader.cpp (original)
> > +++ vmkit/branches/precise/lib/J3/VMCore/JnjvmClassLoader.cpp Sat Sep 11
> > 17:33:49 2010
> > @@ -1073,7 +1073,7 @@
> >         if (!isAbstract(meth.access) && meth.code) {
> >           JavaStaticMethodInfo* MI = new (allocator,
> "JavaStaticMethodInfo")
> >             JavaStaticMethodInfo(0, meth.code, &meth);
> > -          vm->StaticFunctions.addMethodInfo(MI, meth.code);
> > +          vm->FunctionsCache.addMethodInfo(MI, meth.code);
> >         }
> >       }
> >
> > @@ -1082,7 +1082,7 @@
> >         if (!isAbstract(meth.access) && meth.code) {
> >           JavaStaticMethodInfo* MI = new (allocator,
> "JavaStaticMethodInfo")
> >             JavaStaticMethodInfo(0, meth.code, &meth);
> > -          vm->StaticFunctions.addMethodInfo(MI, meth.code);
> > +          vm->FunctionsCache.addMethodInfo(MI, meth.code);
> >         }
> >       }
> >     }
> >
> > Modified: vmkit/branches/precise/lib/Mvm/Compiler/JIT.cpp
> > URL:
> >
> http://llvm.org/viewvc/llvm-project/vmkit/branches/precise/lib/Mvm/Compiler/JIT.cpp?rev=113706&r1=113705&r2=113706&view=diff
> >
> >
> ==============================================================================
> > --- vmkit/branches/precise/lib/Mvm/Compiler/JIT.cpp (original)
> > +++ vmkit/branches/precise/lib/Mvm/Compiler/JIT.cpp Sat Sep 11 17:33:49
> 2010
> > @@ -22,6 +22,7 @@
> > #include <llvm/Analysis/Verifier.h>
> > #include <llvm/Assembly/Parser.h>
> > #include <llvm/CodeGen/GCStrategy.h>
> > +#include <llvm/CodeGen/JITCodeEmitter.h>
> > #include <llvm/Config/config.h>
> > #include <llvm/ExecutionEngine/ExecutionEngine.h>
> > #include "llvm/ExecutionEngine/JITEventListener.h"
> > @@ -35,6 +36,7 @@
> > #include <llvm/Target/TargetMachine.h>
> > #include <llvm/Target/TargetOptions.h>
> > #include <llvm/Target/TargetSelect.h>
> > +#include <../lib/ExecutionEngine/JIT/JIT.h>
> >
> > #include "mvm/JIT.h"
> > #include "mvm/Threads/Locks.h"
> > @@ -93,24 +95,33 @@
> >                                      void *Code, size_t Size,
> >                                      const EmittedFunctionDetails
> &Details) {
> >     assert(F.getParent() == MvmModule::globalModule);
> > -    llvm::GCFunctionInfo* GFI = 0;
> > +    assert(F.hasGC());
> >     // We know the last GC info is for this method.
> > -    if (F.hasGC()) {
> > -      GCStrategy::iterator I = mvm::MvmModule::TheGCStrategy->end();
> > -      I--;
> > -      DEBUG(errs() << (*I)->getFunction().getName() << '\n');
> > -      DEBUG(errs() << F.getName() << '\n');
> > -      assert(&(*I)->getFunction() == &F &&
> > +    GCStrategy::iterator I = mvm::MvmModule::TheGCStrategy->end();
> > +    I--;
> > +    DEBUG(errs() << (*I)->getFunction().getName() << '\n');
> > +    DEBUG(errs() << F.getName() << '\n');
> > +    assert(&(*I)->getFunction() == &F &&
> >         "GC Info and method do not correspond");
> > -      GFI = *I;
> > -    }
> > -    MethodInfo* MI =
> > +    llvm::GCFunctionInfo* GFI = *I;
> > +    JITMethodInfo* MI =
> >       new(*MvmModule::Allocator, "MvmJITMethodInfo")
> MvmJITMethodInfo(GFI, &F);
> > -    VirtualMachine::SharedRuntimeFunctions.addMethodInfo(MI, Code,
> > -                                            (void*)((uintptr_t)Code +
> Size));
> > +    MI->addToVM(mvm::Thread::get()->MyVM,
> (JIT*)MvmModule::executionEngine);
> >   }
> > };
> >
> > +void JITMethodInfo::addToVM(VirtualMachine* VM, JIT* jit) {
> > +  JITCodeEmitter* JCE = jit->getCodeEmitter();
> > +  assert(GCInfo != NULL);
> > +  for (GCFunctionInfo::iterator I = GCInfo->begin(), E = GCInfo->end();
> > +       I != E;
> > +       I++) {
> > +    uintptr_t address = JCE->getLabelAddress(I->Label);
> > +    assert(address != 0);
> > +    VM->FunctionsCache.addMethodInfo(this, (void*)address);
> > +  }
> > +}
> > +
> > static MvmJITListener JITListener;
> >
> > void MvmModule::loadBytecodeFile(const std::string& str) {
> > @@ -317,6 +328,7 @@
> >   unconditionalSafePoint = module->getFunction("unconditionalSafePoint");
> >   conditionalSafePoint = module->getFunction("conditionalSafePoint");
> >   AllocateFunction = module->getFunction("gcmalloc");
> > +  AllocateFunction->setGC("vmkit");
> >   assert(AllocateFunction && "No allocate function");
> >   AllocateUnresolvedFunction = module->getFunction("gcmallocUnresolved");
> >   assert(AllocateUnresolvedFunction && "No allocateUnresolved function");
> >
> > Modified: vmkit/branches/precise/lib/Mvm/Runtime/MethodInfo.cpp
> > URL:
> >
> http://llvm.org/viewvc/llvm-project/vmkit/branches/precise/lib/Mvm/Runtime/MethodInfo.cpp?rev=113706&r1=113705&r2=113706&view=diff
> >
> >
> ==============================================================================
> > --- vmkit/branches/precise/lib/Mvm/Runtime/MethodInfo.cpp (original)
> > +++ vmkit/branches/precise/lib/Mvm/Runtime/MethodInfo.cpp Sat Sep 11
> 17:33:49
> > 2010
> > @@ -24,19 +24,11 @@
> > using namespace mvm;
> >
> > void CamlMethodInfo::scan(uintptr_t closure, void* ip, void* addr) {
> > -  if (!CF && InstructionPointer) {
> > -    MethodInfo* MI =
> VirtualMachine::SharedStaticFunctions.IPToMethodInfo(ip);
> > -    if (MI != &DefaultMethodInfo::DM) {
> > -      CF = ((CamlMethodInfo*)MI)->CF;
> > -    }
> > -  }
> > -
> > -  if (CF) {
> > -    //uintptr_t spaddr = (uintptr_t)addr + CF->FrameSize +
> sizeof(void*);
> > -    uintptr_t spaddr = ((uintptr_t*)addr)[0];
> > -    for (uint16 i = 0; i < CF->NumLiveOffsets; ++i) {
> > -      Collector::scanObject((void**)(spaddr + CF->LiveOffsets[i]),
> closure);
> > -    }
> > +  assert(CF != NULL);
> > +  //uintptr_t spaddr = (uintptr_t)addr + CF->FrameSize + sizeof(void*);
> > +  uintptr_t spaddr = ((uintptr_t*)addr)[0];
> > +  for (uint16 i = 0; i < CF->NumLiveOffsets; ++i) {
> > +    Collector::scanObject((void**)(spaddr + CF->LiveOffsets[i]),
> closure);
> >   }
> > }
> >
> > @@ -59,52 +51,6 @@
> > void DefaultMethodInfo::scan(uintptr_t closure, void* ip, void* addr) {
> > }
> >
> > -
> > -MethodInfo* StartFunctionMap::IPToMethodInfo(void* ip) {
> > -  FunctionMapLock.acquire();
> > -  std::map<void*, MethodInfo*>::iterator E = Functions.end();
> > -  std::map<void*, MethodInfo*>::iterator I = Functions.find(ip);
> > -  MethodInfo* MI = 0;
> > -  if (I == E) {
> > -    Dl_info info;
> > -    int res = dladdr(ip, &info);
> > -    if (res != 0) {
> > -      I = Functions.find(info.dli_saddr);
> > -      if (I == E) {
> > -        // The method is static, and we have no information for it.
> > -        // Just return the Default MethodInfo object.
> > -        MI = &DefaultMethodInfo::DM;
> > -      } else {
> > -        MI = I->second;
> > -      }
> > -    } else {
> > -      // The method is jitted, and no-one has intercepted its
> compilation.
> > -      // Just return the Default MethodInfo object.
> > -      MI = &DefaultMethodInfo::DM;
> > -    }
> > -    // Add it to the map, so that we don't need to call dladdr again.
> > -    Functions.insert(std::make_pair(ip, MI));
> > -  } else {
> > -    MI = I->second;
> > -  }
> > -  FunctionMapLock.release();
> > -  return MI;
> > -}
> > -
> > -MethodInfo* VirtualMachine::IPToMethodInfo(void* ip) {
> > -  MethodInfo* MI = RuntimeFunctions.IPToMethodInfo(ip);
> > -  if (MI) return MI;
> > -
> > -  MI = SharedRuntimeFunctions.IPToMethodInfo(ip);
> > -  if (MI) return MI;
> > -
> > -  MI = StaticFunctions.IPToMethodInfo(ip);
> > -  if (MI != &DefaultMethodInfo::DM) return MI;
> > -
> > -  MI = SharedStaticFunctions.IPToMethodInfo(ip);
> > -  return MI;
> > -}
> > -
> > struct CamlFrames {
> >   uint16_t NumDescriptors;
> >   CamlFrame frames[1];
> > @@ -114,14 +60,11 @@
> >   CamlFrames* frames ;
> >   uint32 currentDescriptor;
> >   CamlFrame* currentFrame;
> > -  Dl_info info;
> >
> >   CamlFrameDecoder(CamlFrames* frames) {
> >     this->frames = frames;
> >     currentDescriptor = 0;
> >     currentFrame = &(frames->frames[0]);
> > -    int res = dladdr(currentFrame->ReturnAddress, &info);
> > -    assert(res != 0 && "No frame");
> >   }
> >
> >   bool hasNext() {
> > @@ -135,55 +78,51 @@
> >       (currentFrame->NumLiveOffsets % 2) * sizeof(uint16_t) +
> >       currentFrame->NumLiveOffsets * sizeof(uint16_t) +
> >       sizeof(void*) + sizeof(uint16_t) + sizeof(uint16_t));
> > -    int res = dladdr(currentFrame->ReturnAddress, &info);
> > -    assert(res != 0 && "No frame");
> >   }
> >
> > -  CamlFrame* next(void** funcAddress, const char** funcName) {
> > +  CamlFrame* next() {
> >     assert(hasNext());
> >     CamlFrame* result = currentFrame;
> > -    *funcAddress = info.dli_saddr;
> > -    *funcName = info.dli_sname;
> > -
> > -    // Skip the remaining ones.
> > -    do {
> > -      advance();
> > -    } while (hasNext() && (info.dli_saddr == *funcAddress));
> > -
> > -    // Skip the entries that start at another method.
> > -    while (hasNext() && (info.dli_saddr == currentFrame->ReturnAddress))
> {
> > -      advance();
> > -    }
> > -
> > -    while (hasNext() && (info.dli_saddr == NULL)) {
> > -      advance();
> > -    }
> > +    advance();
> >     return result;
> >   }
> > };
> >
> > -void SharedStartFunctionMap::initialize() {
> > +static BumpPtrAllocator* StaticAllocator = NULL;
> > +
> > +FunctionMap::FunctionMap() {
> >   CamlFrames* frames =
> >     (CamlFrames*)dlsym(SELF_HANDLE, "camlVmkitoptimized__frametable");
> > +  if (frames == NULL) return;
> > +
> >   StaticAllocator = new BumpPtrAllocator();
> > -  const char* name = NULL;
> > -  void* address = NULL;
> > -
> > -  if (frames != NULL) {
> > -    CamlFrameDecoder decoder(frames);
> > -    while (decoder.hasNext()) {
> > -      CamlFrame* frame = decoder.next(&address, &name);
> > -      StaticCamlMethodInfo* MI = new(*StaticAllocator,
> "StaticCamlMethodInfo")
> > -          StaticCamlMethodInfo(frame, address, name);
> > -      addMethodInfo(MI, address);
> > -    }
> > +  CamlFrameDecoder decoder(frames);
> > +  Dl_info info;
> > +  while (decoder.hasNext()) {
> > +    CamlFrame* frame = decoder.next();
> > +    int res = dladdr(frame->ReturnAddress, &info);
> > +    assert(res != 0 && "No frame");
> > +    StaticCamlMethodInfo* MI = new(*StaticAllocator,
> "StaticCamlMethodInfo")
> > +        StaticCamlMethodInfo(frame, info.dli_sname);
> > +    addMethodInfo(MI, frame->ReturnAddress);
> >   }
> > }
> >
> > -CamlMethodInfo::CamlMethodInfo(CamlFrame* C, void* ip) {
> > -  InstructionPointer = ip;
> > -  CF = C;
> > +MethodInfo* FunctionMap::IPToMethodInfo(void* ip) {
> > +  FunctionMapLock.acquire();
> > +  std::map<void*, MethodInfo*>::iterator I = Functions.find(ip);
> > +  MethodInfo* res = NULL;
> > +  if (I != Functions.end()) {
> > +    res = I->second;
> > +  } else {
> > +    res = &DefaultMethodInfo::DM;
> > +  }
> > +  FunctionMapLock.release();
> > +  return res;
> > }
> >
> > -StartEndFunctionMap VirtualMachine::SharedRuntimeFunctions;
> > -SharedStartFunctionMap VirtualMachine::SharedStaticFunctions;
> > +void FunctionMap::addMethodInfo(MethodInfo* meth, void* ip) {
> > +  FunctionMapLock.acquire();
> > +  Functions.insert(std::make_pair(ip, meth));
> > +  FunctionMapLock.release();
> > +}
> >
> >
> >
> >
> > ------------------------------
> >
> > _______________________________________________
> > vmkit-commits mailing list
> > vmkit-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits
> >
> >
> > End of vmkit-commits Digest, Vol 28, Issue 2
> > ********************************************
> >
> >
> >
> >
> > _______________________________________________
> > vmkit-commits mailing list
> > vmkit-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits
> >
>
> _______________________________________________
> vmkit-commits mailing list
> vmkit-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/vmkit-commits/attachments/20100916/b82ba329/attachment.html>


More information about the vmkit-commits mailing list