Пример #1
0
UserClass* JnjvmClassLoader::loadName(const UTF8* name, bool doResolve,
                                      bool doThrow, JavaString* strName) {
  
  llvm_gcroot(strName, 0);

  UserClass* cl = internalLoad(name, doResolve, strName);

  if (!cl && doThrow) {
    Jnjvm* vm = JavaThread::get()->getJVM();
    if (name->equals(bootstrapLoader->NoClassDefFoundError)) {
      fprintf(stderr, "Unable to load NoClassDefFoundError");
      abort();
    }
    if (TheCompiler->isStaticCompiling()) {
      fprintf(stderr, "Could not find %s, needed for static compiling\n",
              UTF8Buffer(name).cString());
      abort();
    }
    vm->noClassDefFoundError(name);
  }

  ensureCached(cl);

  return cl;
}
Пример #2
0
UserClass* JnjvmClassLoader::loadName(const UTF8* name, bool doResolve,
                                      bool doThrow, JavaString* strName) {
  
  llvm_gcroot(strName, 0);

  UserClass* cl = internalLoad(name, doResolve, strName);

  if (!cl && doThrow) {
    Jnjvm* vm = JavaThread::get()->getJVM();
    if (name->equals(bootstrapLoader->NoClassDefFoundError)) {
      fprintf(stderr, "Unable to load NoClassDefFoundError");
      abort();
    }
    if (TheCompiler->isStaticCompiling()) {
      fprintf(stderr, "Could not find %s, needed for static compiling\n",
              UTF8Buffer(name).cString());
      abort();
    }
    vm->noClassDefFoundError(name);
  }

  if (cl && cl->classLoader != this) {
    classes->lock.lock();
    ClassMap::iterator End = classes->map.end();
    ClassMap::iterator I = classes->map.find(cl->name);
    if (I == End)
      classes->map.insert(std::make_pair(cl->name, cl));
    classes->lock.unlock();
  }

  return cl;
}
Пример #3
0
int main(int argc, char **argv, char **envp) {
  llvm::llvm_shutdown_obj X;

  // Initialize base components.  
  VmkitModule::initialise(argc, argv);
  Collector::initialise(argc, argv);
 
  // Create the allocator that will allocate the bootstrap loader and the JVM.
  vmkit::BumpPtrAllocator Allocator;
  JavaJITCompiler* Comp = JavaJITCompiler::CreateCompiler("JITModule");
  JnjvmBootstrapLoader* loader = new(Allocator, "Bootstrap loader")
    JnjvmBootstrapLoader(Allocator, Comp, true);
  Jnjvm* vm = new(Allocator, "VM") Jnjvm(Allocator, initialFrametables, loader);
 
  // Run the application. 
  vm->runApplication(argc, argv);
  vm->waitForExit();
  System::Exit(0);

  // Destroy everyone.
  // vm->~Jnjvm();
  // loader->~JnjvmBootstrapLoader();

  return 0;
}
Пример #4
0
int main(int argc, char **argv, char **envp) {
  llvm::llvm_shutdown_obj X;  

  // Initialize base components.  
  MvmModule::initialise();
  Collector::initialise();
  
  // Tell the compiler to run all optimizations.
  StandardCompileOpts = true;
 
  // Create the allocator that will allocate the bootstrap loader and the JVM.
  mvm::BumpPtrAllocator Allocator;
  JavaJITCompiler* Comp = JavaJITCompiler::CreateCompiler("JITModule");
  JnjvmBootstrapLoader* loader = new(Allocator, "Bootstrap loader")
    JnjvmBootstrapLoader(Allocator, Comp, true);
  Jnjvm* vm = new(Allocator, "VM") Jnjvm(Allocator, loader);
 
  // Run the application. 
  vm->runApplication(argc, argv);
  vm->waitForExit();
  exit(0);

  // Destroy everyone.
  // vm->~Jnjvm();
  // loader->~JnjvmBootstrapLoader();

  return 0;
}
Пример #5
0
int JavaObjectThrowable::getStackTraceBase(JavaObjectThrowable * self) {
  JavaObject * stack = NULL;
  llvm_gcroot(self, 0);
  llvm_gcroot(stack, 0);

  if (!self->backtrace) return 0;

  Jnjvm* vm = JavaThread::get()->getJVM();

  stack = self->backtrace;
  sint32 index = 2;;
  while (index != JavaArray::getSize(stack)) {
    vmkit::FrameInfo* FI = vm->IPToFrameInfo(ArrayPtr::getElement((ArrayPtr*)stack, index));
    if (FI->Metadata == NULL) ++index;
    else {
      JavaMethod* meth = (JavaMethod*)FI->Metadata;
      assert(meth && "Wrong stack trace");
      if (meth->classDef->isSubclassOf(vm->upcalls->newThrowable)) {
        ++index;
      } else return index;
    }
  }

  assert(0 && "Invalid stack trace!");
  return 0;
}
Пример #6
0
static void mainCompilerLoaderStart(JavaThread* th) {
  Jnjvm* vm = th->getJVM();
  JnjvmBootstrapLoader* bootstrapLoader = vm->bootstrapLoader;
  JavaAOTCompiler* AOT = new JavaAOTCompiler("AOT");
  AOT->compileClassLoader(bootstrapLoader);
  AOT->printStats();
  vm->exit(); 
}
Пример #7
0
JavaObjectMethod* JavaObjectMethod::createFromInternalMethod(JavaMethod* meth, int i) {
  JavaObjectMethod* ret = 0;
  JavaString* str = 0;
  JavaObject* pArr = 0;
  JavaObject* eArr = 0;
  JavaObject* retTy = 0;
  ArraySInt8* ann = 0;
  ArraySInt8* pmAnn = 0;
  ArraySInt8* defAnn = 0;
  llvm_gcroot(ret, 0);
  llvm_gcroot(str, 0);
  llvm_gcroot(pArr, 0);
  llvm_gcroot(eArr, 0);
  llvm_gcroot(retTy, 0);
  llvm_gcroot(ann, 0);
  llvm_gcroot(pmAnn, 0);
  llvm_gcroot(defAnn, 0);

  // TODO: check parameter types
  Jnjvm* vm = JavaThread::get()->getJVM();
  JnjvmClassLoader * classLoader = meth->classDef->classLoader;

  UserClass* Meth = vm->upcalls->newMethod;
  ret = (JavaObjectMethod*)Meth->doNew(vm);
  str = vm->internalUTF8ToStr(meth->name);
  pArr = meth->getParameterTypes(classLoader);
  eArr = meth->getExceptionTypes(classLoader);
  retTy = meth->getReturnType(classLoader);
  JavaString ** sig = getSignature(meth);
  ann = getAnnotations(meth);
  pmAnn = getParamAnnotations(meth);
  defAnn = getAnnotationDefault(meth);

  JavaObject* const* Cl = meth->classDef->getClassDelegateePtr(vm);
  vm->upcalls->initMethod->invokeIntSpecial(vm, Meth, ret,
    Cl,           /* declaring class */
    &str,         /* name */
    &pArr,        /* parameter types */
    &retTy,       /* return type */
    &eArr,        /* exceptions */
    meth->access, /* modifiers */
    i,            /* slot */
    sig,          /* signature */
    &ann,         /* annotations */
    &pmAnn,       /* parameter annotations */
    &defAnn);     /* default annotations */

  return ret;
}
Пример #8
0
JavaObjectField* JavaObjectField::createFromInternalField(JavaField* field, int i) {
  JavaObjectField* ret = 0;
  JavaString* name = 0;
  ArraySInt8* ann = 0;
  llvm_gcroot(ret, 0);
  llvm_gcroot(name, 0);
  llvm_gcroot(ann, 0);

  // TODO: check parameter types
  Jnjvm* vm = JavaThread::get()->getJVM();
  UserClass* Field = vm->upcalls->newField;
  ret = (JavaObjectField*)Field->doNew(vm);
  name = vm->internalUTF8ToStr(field->name);

  //type->Class
  JnjvmClassLoader* loader = field->classDef->classLoader;
  UserCommonClass * fieldCl = field->getSignature()->assocClass(loader);
  assert(fieldCl);
  JavaObject* const* type = fieldCl->getClassDelegateePtr(vm);
  JavaObject* const* Cl = field->classDef->getClassDelegateePtr(vm);

  JavaString** sig = getSignature(field);
  ann = getAnnotations(field);

  /* java.reflect.Field(
  *   Class declaringClass,
  *   String name,
  *   Class type,
  *   int modifiers,
  *   int slot,
  *   String signature,
  *   byte[] annotations)
  */
  vm->upcalls->initField->invokeIntSpecial(vm, Field, ret,
    Cl,
    &name,
    type,
    field->access,
    i,
    sig,
    &ann);

  return ret;
}
Пример #9
0
extern "C" JavaString* Java_java_lang_VMSystem_getenv__Ljava_lang_String_2(JavaString* str) {
  JavaString* ret = 0;
  llvm_gcroot(str, 0);
  llvm_gcroot(ret, 0);
  
  BEGIN_NATIVE_EXCEPTION(0)

  vmkit::ThreadAllocator allocator;
  char* buf = JavaString::strToAsciiz(str, &allocator);
  char* res = getenv(buf);
  if (res) {
    Jnjvm* vm = JavaThread::get()->getJVM();
    ret = vm->asciizToStr(res);
  }
  
  END_NATIVE_EXCEPTION

  return ret;
}
Пример #10
0
extern "C" JavaString* nativeGetenv(JavaString* str) {
  JavaString* ret = 0;
  llvm_gcroot(str, 0);
  llvm_gcroot(ret, 0);
  
  BEGIN_NATIVE_EXCEPTION(0)

  mvm::ThreadAllocator allocator;
  char* buf = JavaString::strToAsciiz(str, &allocator);
  char* res = getenv(buf);
  if (res) {
    Jnjvm* vm = JavaThread::get()->getJVM();
    ret = vm->asciizToStr(res);
  }
  
  END_NATIVE_EXCEPTION

  return ret;
}
Пример #11
0
extern "C" JavaString* nativeInternString(JavaString* obj) {
  const ArrayUInt16* array = 0;
  JavaString* res = 0;
  llvm_gcroot(obj, 0);
  llvm_gcroot(array, 0);
  llvm_gcroot(res, 0);
  // If the string is already interned, just return.
  if (obj->getVirtualTable() == JavaString::internStringVT) return obj;
  
  BEGIN_NATIVE_EXCEPTION(0)
  
  Jnjvm* vm = JavaThread::get()->getJVM();
  array = JavaString::strToArray(obj, vm);
  res = vm->constructString(array);
  
  END_NATIVE_EXCEPTION

  return res;
}
Пример #12
0
int JavaObjectThrowable::getStackTraceDepth(JavaObjectThrowable * self) {
  JavaObject * stack = NULL;
  llvm_gcroot(self, 0);
  llvm_gcroot(stack, 0);

  if (!self->backtrace) return 0;

  Jnjvm* vm = JavaThread::get()->getJVM();

  stack = self->backtrace;
  sint32 index = getStackTraceBase(self);

  sint32 size = 0;
  sint32 cur = index;
  while (cur < JavaArray::getSize(stack)) {
    vmkit::FrameInfo* FI = vm->IPToFrameInfo(ArrayPtr::getElement((ArrayPtr*)stack, cur));
    ++cur;
    if (FI->Metadata != NULL) ++size;
  }

  return size;
}
Пример #13
0
int main(int argc, char **argv, char **envp) {
  llvm::llvm_shutdown_obj X;
  bool EmitClassBytes = false;
  static const char* EmitClassBytesStr = "-emit-class-bytes";
  for (int i = 0; i < argc; i++) {
    if (!strncmp(argv[i], EmitClassBytesStr, strlen(EmitClassBytesStr))) {
      EmitClassBytes = true;
      break;
    }
  }

  std::string OutputFilename;

  // Initialize base components.  
  VmkitModule::initialise(argc, argv);
  Collector::initialise(argc, argv);
  
  // Create the allocator that will allocate the bootstrap loader and the JVM.
  vmkit::BumpPtrAllocator Allocator;
  JavaAOTCompiler* AOT;
  if (EmitClassBytes) {
    AOT = new JavaAOTCompiler("AOT");
    OutputFilename = "classes.bc";
    JnjvmBootstrapLoader* loader = new(Allocator, "Bootstrap loader")
      JnjvmBootstrapLoader(Allocator, AOT, true);
    AOT->generateClassBytes(loader);
  } else {
    OutputFilename = "generated.bc";
    JavaJITCompiler* JIT = JavaJITCompiler::CreateCompiler("JIT");
    JnjvmBootstrapLoader* loader = new(Allocator, "Bootstrap loader")
      JnjvmBootstrapLoader(Allocator, JIT, true);
    Jnjvm* vm = new(Allocator, "VM") Jnjvm(Allocator, frametables, loader);
 
    // Run the application. 
    vm->runApplication(argc, argv);
    vm->waitForExit();

    // Now AOT Compile all compiled methods.
    vm->doExit = false;
    JavaThread* th = new JavaThread(vm);
    vm->setMainThread(th);
    th->start((void (*)(vmkit::Thread*))mainCompilerLoaderStart);
    vm->waitForExit();

    AOT = (JavaAOTCompiler*)loader->getCompiler();
  }


  // Emit the bytecode in file.
  std::string ErrorInfo;
  std::auto_ptr<llvm::raw_ostream> Out 
    (new llvm::raw_fd_ostream(OutputFilename.c_str(), ErrorInfo,
                        llvm::raw_fd_ostream::F_Binary));
  if (!ErrorInfo.empty()) {
    llvm::errs() << ErrorInfo << '\n';
    return 1;
  }
   
  // Make sure that the Out file gets unlinked from the disk if we get a
  // SIGINT.
  llvm::sys::RemoveFileOnSignal(llvm::sys::Path(OutputFilename));
  
  llvm::WriteBitcodeToFile(AOT->getLLVMModule(), *Out);

  return 0;
}