blob: d6fd945f13bceb31a48dce589a7ac6924fd9cc87 [file] [log] [blame]
//===-------- JavaInitialise.cpp - Initialization of JnJVM ----------------===//
//
// JnJVM
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <vector>
#include "mvm/VMLet.h"
#include "mvm/Threads/Locks.h"
#include "JavaArray.h"
#include "JavaCache.h"
#include "JavaClass.h"
#include "JavaConstantPool.h"
#include "JavaIsolate.h"
#include "JavaJIT.h"
#include "JavaObject.h"
#include "JavaString.h"
#include "JavaThread.h"
#include "JavaTypes.h"
#include "JavaUpcalls.h"
#include "Jnjvm.h"
#include "JnjvmModuleProvider.h"
#include "NativeUtil.h"
#include "Reader.h"
#include "LockedMap.h"
#include "Zip.h"
using namespace jnjvm;
ClassArray* JavaArray::ofByte = 0;
ClassArray* JavaArray::ofChar = 0;
ClassArray* JavaArray::ofInt = 0;
ClassArray* JavaArray::ofShort = 0;
ClassArray* JavaArray::ofBool = 0;
ClassArray* JavaArray::ofLong = 0;
ClassArray* JavaArray::ofFloat = 0;
ClassArray* JavaArray::ofDouble = 0;
ClassArray* JavaArray::ofString = 0;
ClassArray* JavaArray::ofObject = 0;
const UTF8* Attribut::codeAttribut = 0;
const UTF8* Attribut::exceptionsAttribut = 0;
const UTF8* Attribut::constantAttribut = 0;
const UTF8* Attribut::lineNumberTableAttribut = 0;
const UTF8* Attribut::innerClassesAttribut = 0;
const UTF8* Attribut::sourceFileAttribut = 0;
JavaObject* CommonClass::jnjvmClassLoader = 0;
CommonClass* ClassArray::SuperArray = 0;
std::vector<Class*> ClassArray::InterfacesArray;
std::vector<JavaMethod*> ClassArray::VirtualMethodsArray;
std::vector<JavaMethod*> ClassArray::StaticMethodsArray;
std::vector<JavaField*> ClassArray::VirtualFieldsArray;
std::vector<JavaField*> ClassArray::StaticFieldsArray;
llvm::Function* JavaJIT::getSJLJBufferLLVM = 0;
llvm::Function* JavaJIT::throwExceptionLLVM = 0;
llvm::Function* JavaJIT::getExceptionLLVM = 0;
llvm::Function* JavaJIT::getJavaExceptionLLVM = 0;
llvm::Function* JavaJIT::clearExceptionLLVM = 0;
llvm::Function* JavaJIT::compareExceptionLLVM = 0;
llvm::Function* JavaJIT::nullPointerExceptionLLVM = 0;
llvm::Function* JavaJIT::classCastExceptionLLVM = 0;
llvm::Function* JavaJIT::indexOutOfBoundsExceptionLLVM = 0;
llvm::Function* JavaJIT::markAndTraceLLVM = 0;
llvm::Function* JavaJIT::javaObjectTracerLLVM = 0;
llvm::Function* JavaJIT::virtualLookupLLVM = 0;
llvm::Function* JavaJIT::fieldLookupLLVM = 0;
llvm::Function* JavaJIT::UTF8AconsLLVM = 0;
llvm::Function* JavaJIT::Int8AconsLLVM = 0;
llvm::Function* JavaJIT::Int32AconsLLVM = 0;
llvm::Function* JavaJIT::Int16AconsLLVM = 0;
llvm::Function* JavaJIT::FloatAconsLLVM = 0;
llvm::Function* JavaJIT::DoubleAconsLLVM = 0;
llvm::Function* JavaJIT::LongAconsLLVM = 0;
llvm::Function* JavaJIT::ObjectAconsLLVM = 0;
llvm::Function* JavaJIT::printExecutionLLVM = 0;
llvm::Function* JavaJIT::printMethodStartLLVM = 0;
llvm::Function* JavaJIT::printMethodEndLLVM = 0;
llvm::Function* JavaJIT::jniProceedPendingExceptionLLVM = 0;
llvm::Function* JavaJIT::doNewLLVM = 0;
llvm::Function* JavaJIT::doNewUnknownLLVM = 0;
llvm::Function* JavaJIT::initialiseObjectLLVM = 0;
llvm::Function* JavaJIT::newLookupLLVM = 0;
llvm::Function* JavaJIT::instanceOfLLVM = 0;
llvm::Function* JavaJIT::aquireObjectLLVM = 0;
llvm::Function* JavaJIT::releaseObjectLLVM = 0;
llvm::Function* JavaJIT::multiCallNewLLVM = 0;
llvm::Function* JavaJIT::runtimeUTF8ToStrLLVM = 0;
llvm::Function* JavaJIT::getStaticInstanceLLVM = 0;
llvm::Function* JavaJIT::getClassDelegateeLLVM = 0;
llvm::Function* JavaJIT::arrayLengthLLVM = 0;
#ifndef SINGLE_VM
llvm::Function* JavaJIT::doNewIsolateLLVM = 0;
#endif
const llvm::FunctionType* JavaJIT::markAndTraceLLVMType = 0;
mvm::Lock* JavaObject::globalLock = 0;
const llvm::Type* JavaObject::llvmType = 0;
const llvm::Type* JavaArray::llvmType = 0;
const llvm::Type* ArrayUInt8::llvmType = 0;
const llvm::Type* ArraySInt8::llvmType = 0;
const llvm::Type* ArrayUInt16::llvmType = 0;
const llvm::Type* ArraySInt16::llvmType = 0;
const llvm::Type* ArrayUInt32::llvmType = 0;
const llvm::Type* ArraySInt32::llvmType = 0;
const llvm::Type* ArrayFloat::llvmType = 0;
const llvm::Type* ArrayDouble::llvmType = 0;
const llvm::Type* ArrayLong::llvmType = 0;
const llvm::Type* ArrayObject::llvmType = 0;
const llvm::Type* UTF8::llvmType = 0;
const llvm::Type* CacheNode::llvmType = 0;
const llvm::Type* Enveloppe::llvmType = 0;
mvm::Key<JavaThread>* JavaThread::threadKey = 0;
Jnjvm* Jnjvm::bootstrapVM = 0;
const UTF8* Jnjvm::initName = 0;
const UTF8* Jnjvm::clinitName = 0;
const UTF8* Jnjvm::clinitType = 0;
const UTF8* Jnjvm::runName = 0;
const UTF8* Jnjvm::prelib = 0;
const UTF8* Jnjvm::postlib = 0;
const UTF8* Jnjvm::mathName = 0;
#define DEF_UTF8(var) \
const UTF8* Jnjvm::var = 0;
DEF_UTF8(abs);
DEF_UTF8(sqrt);
DEF_UTF8(sin);
DEF_UTF8(cos);
DEF_UTF8(tan);
DEF_UTF8(asin);
DEF_UTF8(acos);
DEF_UTF8(atan);
DEF_UTF8(atan2);
DEF_UTF8(exp);
DEF_UTF8(log);
DEF_UTF8(pow);
DEF_UTF8(ceil);
DEF_UTF8(floor);
DEF_UTF8(rint);
DEF_UTF8(cbrt);
DEF_UTF8(cosh);
DEF_UTF8(expm1);
DEF_UTF8(hypot);
DEF_UTF8(log10);
DEF_UTF8(log1p);
DEF_UTF8(sinh);
DEF_UTF8(tanh);
#undef DEF_UTF8
static void initialiseVT() {
# define INIT(X) { \
X fake; \
X::VT = ((void**)(void*)(&fake))[0]; }
INIT(JavaArray);
INIT(ArrayUInt8);
INIT(ArraySInt8);
INIT(ArrayUInt16);
INIT(ArraySInt16);
INIT(ArrayUInt32);
INIT(ArraySInt32);
INIT(ArrayLong);
INIT(ArrayFloat);
INIT(ArrayDouble);
INIT(ArrayObject);
INIT(UTF8);
INIT(Attribut);
INIT(CommonClass);
INIT(Class);
INIT(ClassArray);
INIT(JavaMethod);
INIT(JavaField);
INIT(JavaCtpInfo);
INIT(Exception);
INIT(JavaJIT);
INIT(JavaCond);
INIT(LockObj);
INIT(JavaObject);
INIT(JavaThread);
//mvm::Key<JavaThread>::VT = mvm::ThreadKey::VT;
INIT(AssessorDesc);
INIT(Typedef);
INIT(Signdef);
INIT(ThreadSystem);
INIT(Jnjvm);
INIT(Reader);
INIT(ZipFile);
INIT(ZipArchive);
INIT(UTF8Map);
INIT(ClassMap);
INIT(FieldMap);
INIT(MethodMap);
INIT(ZipFileMap);
INIT(StringMap);
INIT(jnjvm::TypeMap);
INIT(JavaIsolate);
INIT(JavaString);
INIT(CacheNode);
INIT(Enveloppe);
#undef INIT
}
static void initialiseStatics() {
JavaObject::globalLock = mvm::Lock::allocNormal();
//mvm::Object::pushRoot((mvm::Object*)JavaObject::globalLock);
JavaThread::threadKey = new mvm::Key<JavaThread>();
//JavaThread::threadKey = gc_new(mvm::Key<JavaThread>);
//mvm::Object::pushRoot((mvm::Object*)JavaThread::threadKey);
Jnjvm* vm = JavaIsolate::bootstrapVM = JavaIsolate::allocateBootstrap();
mvm::Object::pushRoot((mvm::Object*)JavaIsolate::bootstrapVM);
// Array initialization
const UTF8* utf8OfChar = vm->asciizConstructUTF8("[C");
JavaArray::ofChar = vm->constructArray(utf8OfChar,
CommonClass::jnjvmClassLoader);
((UTF8*)utf8OfChar)->classOf = JavaArray::ofChar;
AssessorDesc::initialise(vm);
ClassArray::InterfacesArray.push_back(
vm->constructClass(vm->asciizConstructUTF8("java/lang/Cloneable"),
CommonClass::jnjvmClassLoader));
ClassArray::InterfacesArray.push_back(
vm->constructClass(vm->asciizConstructUTF8("java/io/Serializable"),
CommonClass::jnjvmClassLoader));
ClassArray::SuperArray =
vm->constructClass(vm->asciizConstructUTF8("java/lang/Object"),
CommonClass::jnjvmClassLoader);
JavaArray::ofChar->interfaces = ClassArray::InterfacesArray;
JavaArray::ofChar->super = ClassArray::SuperArray;
JavaArray::ofByte = vm->constructArray(vm->asciizConstructUTF8("[B"),
CommonClass::jnjvmClassLoader);
JavaArray::ofString =
vm->constructArray(vm->asciizConstructUTF8("[Ljava/lang/String;"),
CommonClass::jnjvmClassLoader);
JavaArray::ofObject =
vm->constructArray(vm->asciizConstructUTF8("[Ljava/lang/Object;"),
CommonClass::jnjvmClassLoader);
JavaArray::ofInt = vm->constructArray(vm->asciizConstructUTF8("[I"),
CommonClass::jnjvmClassLoader);
JavaArray::ofBool = vm->constructArray(vm->asciizConstructUTF8("[Z"),
CommonClass::jnjvmClassLoader);
JavaArray::ofLong = vm->constructArray(vm->asciizConstructUTF8("[J"),
CommonClass::jnjvmClassLoader);
JavaArray::ofFloat = vm->constructArray(vm->asciizConstructUTF8("[F"),
CommonClass::jnjvmClassLoader);
JavaArray::ofDouble = vm->constructArray(vm->asciizConstructUTF8("[D"),
CommonClass::jnjvmClassLoader);
JavaArray::ofShort = vm->constructArray(vm->asciizConstructUTF8("[S"),
CommonClass::jnjvmClassLoader);
// End array initialization
Attribut::codeAttribut = vm->asciizConstructUTF8("Code");
Attribut::exceptionsAttribut = vm->asciizConstructUTF8("Exceptions");
Attribut::constantAttribut = vm->asciizConstructUTF8("ConstantValue");
Attribut::lineNumberTableAttribut =
vm->asciizConstructUTF8("LineNumberTable");
Attribut::innerClassesAttribut = vm->asciizConstructUTF8("InnerClasses");
Attribut::sourceFileAttribut = vm->asciizConstructUTF8("SourceFile");
Jnjvm::initName = vm->asciizConstructUTF8("<init>");
Jnjvm::clinitName = vm->asciizConstructUTF8("<clinit>");
Jnjvm::clinitType = vm->asciizConstructUTF8("()V");
Jnjvm::runName = vm->asciizConstructUTF8("run");
Jnjvm::prelib = vm->asciizConstructUTF8("lib");
Jnjvm::postlib = vm->asciizConstructUTF8(".so");
Jnjvm::mathName = vm->asciizConstructUTF8("java/lang/Math");
#define DEF_UTF8(var) \
Jnjvm::var = vm->asciizConstructUTF8(#var)
DEF_UTF8(abs);
DEF_UTF8(sqrt);
DEF_UTF8(sin);
DEF_UTF8(cos);
DEF_UTF8(tan);
DEF_UTF8(asin);
DEF_UTF8(acos);
DEF_UTF8(atan);
DEF_UTF8(atan2);
DEF_UTF8(exp);
DEF_UTF8(log);
DEF_UTF8(pow);
DEF_UTF8(ceil);
DEF_UTF8(floor);
DEF_UTF8(rint);
DEF_UTF8(cbrt);
DEF_UTF8(cosh);
DEF_UTF8(expm1);
DEF_UTF8(hypot);
DEF_UTF8(log10);
DEF_UTF8(log1p);
DEF_UTF8(sinh);
DEF_UTF8(tanh);
#undef DEF_UTF8
}
extern "C" void sigsegv_handler(int val, void* addr) {
printf("SIGSEGV in JnJVM at %p\n", addr);
JavaJIT::printBacktrace();
assert(0);
}
extern "C" int boot() {
JavaJIT::initialise();
initialiseVT();
initialiseStatics();
Classpath::initialiseClasspath(JavaIsolate::bootstrapVM);
//mvm::VMLet::register_sigsegv_handler(sigsegv_handler);
return 0;
}
extern "C" int start_app(int argc, char** argv) {
JavaIsolate* vm = JavaIsolate::allocateIsolate(JavaIsolate::bootstrapVM);
vm->runMain(argc, argv);
return 0;
}