//===--------------------- LinkJavaRuntime.h ------------------------------===//
//=== ------------- Reference all runtime functions -----------------------===//
//
//                              JnJVM
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef JNJVM_LINK_JAVA_RUNTIME_H
#define JNJVM_LINK_JAVA_RUNTIME_H


namespace jnjvm {
  class CacheNode;
  class JavaObject;
  class UserClass;
  class UserClassArray;
  class UserCommonClass;
  class UserConstantPool;
  class JavaVirtualTable;
  class JavaMethod;
  class Jnjvm;
}

using namespace jnjvm;

extern "C" void* jnjvmInterfaceLookup(CacheNode* cache, JavaObject *obj);
extern "C" void* jnjvmVirtualFieldLookup(UserClass* caller, uint32 index);
extern "C" void* jnjvmStaticFieldLookup(UserClass* caller, uint32 index);
extern "C" void* jnjvmVirtualTableLookup(UserClass* caller, uint32 index, ...);
extern "C" void* jnjvmStringLookup(UserClass* cl, uint32 index);
extern "C" void* jnjvmClassLookup(UserClass* caller, uint32 index);
extern "C" UserCommonClass* jnjvmRuntimeInitialiseClass(UserClass* cl);
extern "C" JavaObject* jnjvmRuntimeDelegatee(UserCommonClass* cl);
extern "C" JavaArray* jnjvmMultiCallNew(UserClassArray* cl, uint32 len, ...);
extern "C" UserClassArray* jnjvmGetArrayClass(UserCommonClass*,
                                              UserClassArray**);
extern "C" void jnjvmEndJNI();
extern "C" void* jnjvmStartJNI();
extern "C" void jnjvmJavaObjectAquire(JavaObject* obj);
extern "C" void jnjvmJavaObjectRelease(JavaObject* obj);
extern "C" void jnjvmThrowException(JavaObject* obj);
extern "C" void jnjvmOverflowThinLock(JavaObject* obj);
extern "C" JavaObject* jnjvmNullPointerException();
extern "C" JavaObject* jnjvmNegativeArraySizeException(sint32 val);
extern "C" JavaObject* jnjvmOutOfMemoryError(sint32 val);
extern "C" JavaObject* jnjvmStackOverflowError();
extern "C" JavaObject* jnjvmArithmeticException();
extern "C" JavaObject* jnjvmClassCastException(JavaObject* obj,
                                               UserCommonClass* cl);
extern "C" JavaObject* jnjvmIndexOutOfBoundsException(JavaObject* obj,
                                                      sint32 index);
extern "C" JavaObject* jnjvmArrayStoreException(JavaVirtualTable* VT);
extern "C" void jnjvmThrowExceptionFromJIT();
extern "C" void jnjvmPrintMethodStart(JavaMethod* meth);
extern "C" void jnjvmPrintMethodEnd(JavaMethod* meth);
extern "C" void jnjvmPrintExecution(uint32 opcode, uint32 index,
                                    JavaMethod* meth);


#ifdef SERVICE
extern "C" void jnjvmServiceCallStart(Jnjvm* OldService,
                                      Jnjvm* NewService);
extern "C" void jnjvmServiceCallStop(Jnjvm* OldService,
                                     Jnjvm* NewService);
#endif




#ifdef ISOLATE_SHARING
extern "C" void* jnjvmEnveloppeLookup(UserClass* cl, uint32 index);
extern "C" void* jnjvmStaticCtpLookup(UserClass* cl, uint32 index);
extern "C" UserConstantPool* jnjvmSpecialCtpLookup(UserConstantPool* ctpInfo,
                                                   uint32 index,
                                                   UserConstantPool** res);
#endif


namespace {
  struct ForceRuntimeLinking {
    ForceRuntimeLinking() {
      // We must reference the passes in such a way that compilers will not
      // delete it all as dead code, even with whole program optimization,
      // yet is effectively a NO-OP. As the compiler isn't smart enough
      // to know that getenv() never returns -1, this will do the job.
      if (std::getenv("bar") != (char*) -1) 
        return;
      
      (void) jnjvmInterfaceLookup(0, 0);
      (void) jnjvmVirtualFieldLookup(0, 0);
      (void) jnjvmStaticFieldLookup(0, 0);
      (void) jnjvmVirtualTableLookup(0, 0);
      (void) jnjvmClassLookup(0, 0);
      (void) jnjvmRuntimeInitialiseClass(0);
      (void) jnjvmRuntimeDelegatee(0);
      (void) jnjvmMultiCallNew(0, 0);
      (void) jnjvmGetArrayClass(0, 0);
      (void) jnjvmEndJNI();
      (void) jnjvmStartJNI();
      (void) jnjvmJavaObjectAquire(0);
      (void) jnjvmJavaObjectRelease(0);
      (void) jnjvmThrowException(0);
      (void) jnjvmOverflowThinLock(0);
      (void) jnjvmNullPointerException();
      (void) jnjvmNegativeArraySizeException(0);
      (void) jnjvmOutOfMemoryError(0);
      (void) jnjvmStackOverflowError();
      (void) jnjvmArithmeticException();
      (void) jnjvmClassCastException(0, 0);
      (void) jnjvmIndexOutOfBoundsException(0, 0);
      (void) jnjvmArrayStoreException(0);
      (void) jnjvmThrowExceptionFromJIT();
      (void) jnjvmPrintMethodStart(0);
      (void) jnjvmPrintMethodEnd(0);
      (void) jnjvmPrintExecution(0, 0, 0);
      (void) jnjvmStringLookup(0, 0);
#ifdef SERVICE
      (void) jnjvmServiceCallStart(0, 0);
      (void) jnjvmServiceCallStop(0, 0);
#endif

#ifdef ISOLATE_SHARING
      (void) jnjvmEnveloppeLookup(0, 0);
      (void) jnjvmStaticCtpLookup(0, 0);
      (void) jnjvmSpecialCtpLookup(0, 0, 0);
#endif

    }
  } ForcePassLinking; // Force link by creating a global definition.
}
  


#endif //JNJVM_LINK_JAVA_RUNTIME_H
