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

Richard Corsale igf1 at yahoo.com
Tue Sep 14 14:27:03 PDT 2010


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
********************************************



      



More information about the vmkit-commits mailing list