Port de sablevm sous Windows

Licence

Ce document est gratuit; vous pouvez le redistribuer et/ou le modifier en accord avec les termes de la GNU Lesser General Public License, telle que stipulée dans les textes du permis 2.1(ou une version ultérieure) de la Free Software Foundation.  Ce document est distribué dans l'espoir qu'il sera utile mais sans aucune garantie de quelque nature que ce soit.

TABLE DES MATIÈRES

1. Introduction
1.1 Objectif de ce document
1.2 Survol du document
1.3 Glossaire

2. Première étape: Port sous Cygwin
2.1 Description générale des étapes du port

2.1.1 Installation de Cygwin
2.1.2 Installation d'un compilateur java
2.1.3 Compilation et exécution de sablevm
2.1.4 Compilation et exécution de sablevm-classpath

2.2. Description spécifique des étapes du port

2.2.1 Détail des modifications pour sablevm
2.2.2 Détail des modifications pour le classpath

3. Deuxième étape: Port sous Windows

4. À faire
4.1 Port de sablevm sous Cygwin
4.2 Port de sablevm sous Windows

5. Contributions

6. Annexes
6.1 Port de sablevm sous Cygwin

6.1.1 Fichier « diff » de sablevm
6.1.2 Fichier « diff » de sablevm-classpath

6.2 Port de sablevm sous Windows


1. Introduction

1.1 Objectif de ce document

Ce document a pour mandat de comptabiliser et d'expliquer les problèmes rencontrés et les solutions apportées lors du port, sous Windows, de la machine virtuelle java: sablevm. Il s'adresse donc à toutes personnes intéressées à poursuivre le port de sablevm sous Windows ou simplement désirant tenter l'installation de sablevm sous cette même plate-forme.

Dans un premier temps, le port de sablevm se fera sous Cygwin et puis ensuite, à l'aide des outils purement Microsoft, directement sous Windows. C'est pourquoi, ce document est divisé en deux parties principales soit la partie traitant du port sous Cygwin soit la partie expliquant le port sous Windows.

Ce document est donc un travail en cours et tout individu désirant y apporter sa contribution est bien venu de le faire. Le tableau ci-dessous contient la liste de tout changement important apporté au document ainsi que la date, l'auteur(e) et le numéro de version qui s'y rattachent. Pour un suivi des modifications adéquat, il est donc important que chaques contributeurs conservent ce tableau à jour.

Versions

Version

Auteur(e)

Date

Modification(s)

v1.0

Mélanie Lord

15/12/2003

  • Création du document

  • Port sous Cygwin d'une version « vanille » de sablevm obtenu en utilisant l'option de configuration « enable-debugging-features »

  • Exécution de « Hello World »  mais aucun autre test effectué






1.2 Survol de ce document

Sections principales

Section

Description

1. Introduction

Cette section présente les grandes lignes de ce document: ses intentions, à qui il s'adresse ainsi qu'une brève description de ses différentes sections. Cette section comprend aussi un glossaire des termes utilisés dans ce document.

2. Première étape: Port sous Cygwin

Cette section montre les changements apportés pour réaliser le port de sablevm sous Cygwin.

2.1 Description générale du port

Mise en contexte des problèmes rencontrés et explication générale des solutions apportées.

2.2.Description spécifique du port

Commentaires sur les fichiers « diff » résultant des modifications apportées à sablevm ainsi qu'à sablevm-classpath.

3. Deuxième étape: Port sous Windows

Cette section montre les changements apportés pour réaliser le port de sablevm sous Windows.

4. À faire

Cette section fait l'inventaire des étapes qu'il reste à franchir pour la réalisation complète du port de sablevm sous Cygwin et sous Windows.

5. Contributions

Cette section présente la liste de touts les contributeurs autres que ceux mentionnés dans le tableau des versions du présent document.

6. Annexes

Cette section contient tout document jugé intéressant et complémentaire au présent document.



1.3 Glossaire

Glossaire

Terme

Signification

sablevm

La machine virtuelle java dont le nom est sablevm

dll

Librairie dynamique (dynamic link library)

Cygwin

Un émulateur de Linux sous Windows

Libsablevm

La librairie dynamique libsablevm.



2. Première étape: Port sous Cygwin

2.1 Description générale des étapes du port

2.1.1 Installation de Cygwin

Évidemment, avant de pouvoir porter sablevm sous Cygwin, il faut avoir préalablement installé Cygwin sous Windows. Lors de l'installation, il faut s'assurer d'installer toutes les librairies requises et tous les outils nécessaires pour la compilation de sablevm (libpopt, libltdl, libffi, libtool, gcc...). Il est recommandé de consulter la documentation de sablevm à ce sujet.

Toutes les librairies requises pour exécuter sablevm sont disponibles sous Cygwin à l'exception de la librairie libffi dont l'installation a été un peu plus compliquée. Ce cas particulier est discuté à la section 2.1.3.

Notes:

2.1.2 Installation d'un compilateur java

Un compilateur java est nécessaire pour compiler les fichiers java contenus dans sablevm-classpath. Il doit être installé sous Cygwin. Celui qui a été utilisé pour le port est Jikes1.18. et celui-ci peut être téléchargé à cette adresse: http://anfaenger.de/cygwin/jikes/jikes-1.18-src.tar.bz2

2.1.3 Compilation et exécution de sablevm

Le port de sablevm sous Cygwin a été effectué avec une version de sablevm qu'on peut récupérer soit avec Subversion, à l'adresse svn.sablevm.org/sablevm/branches/staging/ ou en téléchargeant une image de sablevm-staging à l'adresse http://devel.sablevm.org/shot/latest/sablevm-staging-svn.tar.gz

Configuration

Pour la première tentative du port, afin d'obtenir la configuration la plus « vanille » de sablevm (version « switch », sans signaux, sans « inlined threading » etc.) le script de configuration a été exécuté avec l'option « enable-debugging-features » qui assure la compilation de la version la plus simple possible. Il serait intéressant, dans le futur, d'assurer le port d'autres configurations de sablevm telles que « inlined », « direct », « traditional », « nosig » etc.

Compilation et Exécution

Lors de la compilation, une série d'avertissements de ce genre a laissé supposer qu'il y aurait certainement des problèmes à l'exécution de sablevm.

*** Warning: This system can not link to static lib archive ../fdlibm/libfdlibm.la.
*** I have the capability to make that library automatically link in when
*** you link to this library. But I can only do this if you have a
*** shared version of the library, which you do not appear to have.


Effectivement, les librairies dynamiques n'ayant pas toutes été créées lors de la compilation sous Cygwin, l'exécution a échoué en lançant une erreur reliée à la liaison des librairies, pendant l'exécution.

En fait, deux librairies manquaient dans leur version dynamique: libsablevm et libffi. En ce qui concerne les librairies libpopt et libltdl, les versions dynamiques avaient été créées et installées correctement, probablement à cause du fait que ces deux librairies existaient sous forme de paquetage créé exprès pour Cygwin contrairement à libffi, installée via gcc et à libsablevm. Il fallait donc trouver le moyen de créer les versions dynamiques des librairies requises manquantes.

Librairies dynamiques sous Cygwin

Lors de la création d'une librairie dynamique, 3 fichiers sont créés.

Par exemple, supposons que le nom de la librairie soit « toto » et que sa version soit 2, si on créait une version dynamique de cette librairie, on obtiendrait ces 3 fichiers:

libtoto.dll.a

  • Librairie d'importation: contient l'information qui communique au système d'exploitation la manière dont le programme intéragit avec la dll (son importation).

libtoto.la

  • Librairie dynamique créée par libtool.

  • Fait le lien entre le fichier .dll et le fichier .dll.a.

  • Contient des informations telles la version de la librairie, son répertoire d'installation etc.

cygtoto-2.dll

  • Le code et les données: la dll à proprement parler.

NOTES:
  1. Le fichier .dll.a et le fichier .la sont placés dans un répertoire /lib tandis que le fichier .dll est placé dans un répertoire /bin par défaut.

  2. Il est possible de charger(dlopen) autant le fichier .la que le fichier .dll.

Pour forcer libtool à créer des librairies dynamiques sous Cygwin, le truc qui a fonctionné a été d'ajouter l'option « -no-undefined » à la ligne ou apparaît la variable LDFLAGS, drapeau utilisé par libtool lorsqu'il lie un programme à une librairie dynamique. Pour libsablevm, il n'a suffit que d'ajouter cette option au Makefile pour obtenir les 3 fichiers de la version dynamique dans les répertoires /lib et /bin du répertoire d'installation de sablevm .

En ce qui concerne libffi, l'exercice a été un peu plus ardu.

Obtention d'une version dynamique de la librairie libffi

Une version statique de libffi avait déjà été installée via l'installation de gcc sous Cygwin mais les fichiers d'entêtes, par exemple, étaient manquants.

Les étapes suivantes sont celles qui ont permis la création d'une version dynamique fonctionnelle de libffi:

  1. Puisque la librairie libffi est maintenue par gcc, téléchargement d'une version récente de gcc à partir du site de Debian par exemple.

  2. Application d'un changement dans le fichier gcc../libffi/configure.in pour permettre la compilation séparée de libffi plutôt que la compilation complète de gcc.

libffi/configure.in~ 2003-10-22 01:02:59.000000000 +0200
+++ libffi/configure.in 2003-11-11 12:33:40.000000000 +0100
@@ -29,6 +29,7 @@
else
libffi_basedir=
fi
+libffi_basedir=
AC_SUBST(libffi_basedir)
AC_CONFIG_AUX_DIR(${libffi_vasedir}..)
**voir la page web à l'adresse suivanrte pour plus d'information: http://devel.sablevm.org/wiki/index.cgi?LibFFI
  1. Ajout de deux macros dans le fichier acinclude.m4, pour permettre au script gcc.../libffi/autogen.sh de fonctionner correctement:

    AC_DEFUN([AC_C_BIGENDIAN_CROSS]
    AC_DEFUN([AC_COMPILE_CHECK_SIZEOF]

  2. Exécution du script gcc.../libffi/autogen.sh pour regénérer le script configuration.

  3. Exécution du processus d'installation normale de libffi (configure, make et make install) pour obtenir une version statique de libffi et du même coup, les fichiers d'entêtes de libffi. Une version dynamique(dll) est aussi créée et installée à ce moment mais cette version est presque vide et n'est pas dutout fonctionnelle.

  4. Reconfiguration avec l'option « --enable-shared » (peut-être non indispensable) et compilation de libffi, à la main, en modifiant la ligne de compilation originale, afin de forcer la création d'une librairie dynamique fonctionnelle:

La ligne de compilation originale ressemble à ceci (on remarque qu'il y manque la liste des fichiers objets):

gcc -shared -o .libs/cygffi-2-00-beta.dll -Wl,--image-base=0x10000000 -Wl,out-implib,.libs/libffi.dll.a



La nouvelle ligne de compilation, intégrant, cette fois, la liste des fichiers objets, devrait ressembler à ceci:

gcc -shared \
./src/debug.o ./src/java_raw_api.o ./src/prep_cif.o \
./src/raw_api.o ./src/types.o ./src/x86/ffi.o ./src/x86/win32.o \
-o .libs/cygffi-2-00-beta.dll -Wl,--image-base=0x10000000 \
-Wl,--out-implib,.libs/libffi.dll.a

L'exécution de la ligne de commande ci-dessus compile une version dynamique pleinement fonctionnelle de la librairie libffi.


Impossibilité, pour une librairie dynamique, de se charger elle-même.

L'histoire de la création des librairies dynamiques étant réglée, une autre difficulté s'est manifestée:

Sous Cygwin, une librairie dynamique ne peut obtenir un « handle » d'elle-même. En d'autres termes, la commande dlopen(NULL) ne fonctionne pas. Cette constatation a fait apparaitre un autre obstacle étant donné que la librairie libsablevm utilisait la commande dlopen(NULL) pour obtenir un « Handle » pointant sur elle-même afin de faire appel à d'autres fonctions(en obtenant un pointeur sur ces fonctions) contenues, elles aussi, dans la librairie dynamique libsablevm.

La solution proposée et adoptée pour résoudre ce contre-temps a été de construire, au début de l'exécution de la machine virtuelle, une liste de toutes les adresses des fonctions à exporter de la librairie dynamique libsablevm et conserver cette liste en mémoire pour y référer à volonté. Un arbre binaire (splay tree), dont chaque noeud a pour clé le nom de la fonction et pour donnée, le pointeur à la fonction de ce nom, a été mis en place. Chaques fonctions exportées a été insérées dans cet arbre. Ainsi, il est désormais possible d'obtenir un pointeur à une fonction exportée de libsablevm directement en la recherchant, par son nom, dans l'arbre binaire. La mise en place de cet arbre binaire n'a pas été très laborieuse puisque sablevm contenait déjà un dispositif permettant d'implanter rapidement ce genre de structure, lorsque désirée. Les détails de cette opération sont expliqués à la section 2.2.1.

2.1.4 Compilation et exécution de sablevm-classpath

La version du classpath correspondant à la version de sablevm utilisée pour le port peut se récupérer soit, avec subversion, à l'adresse svn.sablevm.org/svn/sablevm-classpath/branches/staging/ soit, en téléchargeant une image de sablevm-classpath-staging à l'adresse http://devel.sablevm.org/shot/latest/sablevm-classpath-staging-svn.tar.gz

Dans un premier temps, pour arriver à compiler sablevm-classpath, il a été nécessaire de transformer quelques lignes de quelques fichiers, en commentaires. Entre autre, par exemple, la compilation de gtk-peer a été annulée pour facilité la compilation du classpath sous Cygwin. Cette solution n'est certainement pas élégante et demeure temporaire. Il sera nécessaire, dans le futur, de corriger cela.

Après avoir réussi à compiler le classpath, il a fallu ajouter, comme dans le cas de sablevm, l'option « -no-undefined » à la ligne ou la variable LDFLAGS apparaît et ce, pour tous les Makefiles de toutes les librairies natives, afin de générer les versions dynamiques de ces librairies.

Finalement, il n'est resté qu'un petit détail à régler: À ce jour, le nom des librairies dynamiques chargées, dans le classpath, était codé directement comme portant l'extension « .so ». Comme, sous Cygwin, les librairies à charger portent l'extension .la (ou .dll), cela posait un problème. Pour l'instant, cette difficulté a été réglée en codant directement l'extension .la. Cette solution est évidemment temporaire et est appelée à être améliorée dans le futur.

Le détail des changements apportés au classpath est exposé à la section 2.2.2.

2.2 Description spécifique des étapes du port

2.2.1 Détails des modifications pour sablevm

Index: configure.ac
===================================================================
--- configure.ac (revision 1204)
+++ configure.ac (revision 1295)
@@ -6,6 +6,10 @@
Ajout d'une macro pour permettre un message significatif lors de la configuration
si la version d'autoconf n'est pas au moins celle recommandée ie 2.52
dnl * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
AC_INIT([sablevm], [1.0.9], [http://www.sablevm.org/])
+
+dnl minimal version of autoconf under cygwin
+AC_PREREQ(2.52)
+
AM_INIT_AUTOMAKE(AC_PACKAGE_TARNAME, AC_PACKAGE_VERSION)
AM_CONFIG_HEADER(src/include/config.h)
@@ -258,6 +262,21 @@
Définition du symbole=PLATEFORM_WIN32 si l'hôte est Cygwin(ou Mingw).
La définition de ce symbole servira, plus tard, dans le Makefile, de condition
pour définir une variable nécessaire à la génération des librairies dynamiques sous
Cygwin.
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
+
+AC_MSG_CHECKING([for some Win32 platform])
+
+case "$host" in
+ *-*-mingw*|*-*-cygwin*)
+ platform_win32=yes
+ ;;
+ *)
+ platform_win32=no
+ ;;
+esac
+AC_MSG_RESULT([$platform_win32])
+AM_CONDITIONAL(PLATFORM_WIN32, test "$platform_win32" = "yes")
+
dnl TODO: we should allow user to force if the __clear_cache was used or not
case "$system_clear_cache" in
yes)AC_DEFINE(HAS_SYSTEM_CLEAR_CACHE,1,use __clear_cache) ;;
Index: src/libsablevm/util2.c
===================================================================
--- src/libsablevm/util2.c (revision 1204)
+++ src/libsablevm/util2.c (revision 1295)
@@ -446,6 +446,22 @@
Fonction de comparaison devant être fournie pour la mise en place de l'arbre binaire (splay tree)
contenant les adresses de toutes les fonctions exportables de la librairie dynamique libsablevm.
/*
----------------------------------------------------------------------
+_svmf_tree_compare_function
+----------------------------------------------------------------------
+*/
+inline static jint
+_svmf_tree_compare_function (_svmt_function_node * value1,
+ _svmt_function_node * value2)
+{
+ assert (value1 != NULL);
+ assert (value2 != NULL);
+
+ return strcmp (value1->name, value2->name);
+
+}
+
+/*
+----------------------------------------------------------------------
_svmf_tree_compare_interface_method_signature
----------------------------------------------------------------------
*/
Index: src/libsablevm/exported_functions.m4.c
===================================================================
--- src/libsablevm/exported_functions.m4.c (revision 0)
+++ src/libsablevm/exported_functions.m4.c (revision 1295)
@@ -0,0 +1,72 @@
Ce nouveau fichier est responsable de la génération du fichier exported_functions.c.
Pour chaque fonction exportable de libsablevm, listée dans le fichier exported_functions.list,
l'adresse de la fonction est inséré dans l'arbre binaire des fonctions exportables de libsablevm.
Chaque noeud de l'arbre contient une clé, qui est le nom de la fonction et une donnée qui est
l'adresse de la fonction.
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * This file is part of SableVM. *
+ * See the file "LICENSE" for Copyright information and the *
+ * terms and conditions for copying, distribution and *
+ * modification of SableVM. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+----------------------------------------------------------------------
+m4svm_file_head
+----------------------------------------------------------------------
+*/
+
+m4svm_define_begin v = ":], [:m4svm_file_head:])";
+
+static jint
+m4svmf_initialize_functions_tree (_svmt_JNIEnv *env)
+{
+ /*node to insert in the functions splay tree*/
+ _svmt_function_node *function_node = NULL;
+
+ /*
+ * Stocking the pointer to each function to export from
+ * libsablevm in a splay tree
+ */
+
+ m4svm_define_end v = ":])";
+
+/*
+----------------------------------------------------------------------
+m4svm_file_tail
+----------------------------------------------------------------------
+*/
+
+ m4svm_define_begin v = ":], [:m4svm_file_tail:])";
+ return JNI_OK;
+}
+
+m4svm_define_end v = ":])";
+
+/*
+----------------------------------------------------------------------
+m4svm_java_function
+----------------------------------------------------------------------
+*/
+
+/*
+ * This macro can be multi-called.
+ * m4svm_multicall(m4svm_java_function)
+ */
+
+void
+M4svm_java_function ()
+{
+
+ m4svm_define_begin v = ":], [:m4svm_java_function:])";
+
+ /* Put address of $1 into splay tree */
+
+ if (_svmm_gzalloc_function_node (env, function_node) != JNI_OK)
+ {
+ return JNI_ERR;
+ }
+
+ function_node->name = "$1";
+ function_node->code = (void (*)(void))$1;
+
+ _svmm_tree_insert_function (env->vm->class_loading.boot_loader.functions_tree_root, function_node);
+
+ m4svm_define_end v = ":])";
+
+}
Index: src/libsablevm/invoke_interface.c
===================================================================
--- src/libsablevm/invoke_interface.c (revision 1204)
+++ src/libsablevm/invoke_interface.c (revision 1295)
C'est ici que la fonction dlopen(NULL) était utilisée. Cette instruction est ici remplacée
par l'initialisation du « handle » à NULL. Plus tard, dans la fonction svmf_bind_native_method
du fichier native.c, si le « handle » est égal à NULL, c'est à ce moment que la méthode sera
directement recherchée dans l'arbre binaire, sans avoir recours au « handle » habituel.
@@ -360,6 +360,7 @@
goto error;
}
+ /*
vm->class_loading.boot_loader.class_loader_info->native_library_list->
handle = lt_dlopen (NULL);
if (vm->class_loading.boot_loader.class_loader_info->native_library_list->
@@ -367,6 +368,14 @@
{
goto error;
}
+
+ In this particular case, instead of libsablevm dlopen itself, we
+ initialize the handle to NULL and this case will be manage in the function
+ _svmf_bind_native_method in native.c: if the handle is null, search
+ the handle in the functions splay tree (trying with short and long name).
+ */
+ vm->class_loading.boot_loader.class_loader_info->native_library_list->
+ handle = NULL;
/* time to bootstrap! */
if (_svmf_bootstrap (env) != JNI_OK)
Index: src/libsablevm/exported_functions.list
===================================================================
--- src/libsablevm/exported_functions.list (revision 0)
+++ src/libsablevm/exported_functions.list (revision 1295)
@@ -0,0 +1,141 @@
Liste des fonctions exportables de la librairie dynamique libsablevm. Cette liste est utilisée
par le fichier exported_functions.m4.c pour générer le fichier exported_functions.c qui contient
le code qui initialise l'arbre binaire des fonctions exportées de libsablevm en y insérant toutes
les adresse de ces fonctions.
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * This file is part of SableVM. *
+ * See the file "LICENSE" for Copyright information and the *
+ * terms and conditions for copying, distribution and *
+ * modification of SableVM. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+
+----------------------------------------------------------------------
+head
+----------------------------------------------------------------------
+
+m4svm_file_name
+
+----------------------------------------------------------------------
+file_head
+----------------------------------------------------------------------
+
+m4svm_file_head
+
+----------------------------------------------------------------------
+list of internal java function
+----------------------------------------------------------------------
+
+m4svm_java_function_begin[:
+
+JNI_GetDefaultJavaVMInitArgs
+JNI_GetCreatedJavaVMs
+JNI_CreateJavaVM
+Java_java_io_VMObjectStreamClass_hasClassInitializer
+Java_java_lang_Object_getClass
+Java_java_lang_ProcessImpl_nativeWaitFor
+Java_java_lang_Runtime_availableProcessors
+Java_java_lang_Runtime_freeMemory
+Java_java_lang_Runtime_totalMemory
+Java_java_lang_Runtime_maxMemory
+Java_java_lang_Runtime_execInternal
+Java_java_lang_Runtime_exitInternal
+Java_java_lang_Runtime_runFinalization
+Java_java_lang_Runtime_gc
+Java_java_lang_Runtime_traceInstructions
+Java_java_lang_Runtime_traceMethodCalls
+Java_java_lang_Runtime_nativeLoad
+Java_java_lang_Runtime_getBootstrapClassPath
+Java_java_lang_Runtime_getBootstrapLibraryPath
+Java_java_lang_Runtime_getSableVMVersion
+Java_java_lang_Runtime_getFileSeparator
+Java_java_lang_Runtime_getPathSeparator
+Java_java_lang_Runtime_getLineSeparator
+Java_java_lang_Runtime_getUserName
+Java_java_lang_Runtime_getUserHome
+Java_java_lang_Runtime_getWorkDir
+Java_java_lang_Runtime_getPropertyCount
+Java_java_lang_Runtime_getProperty
+Java_java_lang_SecurityManager_getClassContext
+Java_java_lang_VMThread_yield
+Java_java_lang_VMThread_nativeIsAlive
+Java_java_lang_VMThread_nativeStart
+Java_java_lang_VMThread_currentThread
+Java_java_lang_Throwable_nativeGetStackTraceList
+Java_java_lang_VMClass_isArray
+Java_java_lang_VMClass_isInstance
+Java_java_lang_VMClass_getModifiers
+Java_java_lang_VMClass_isInterface
+Java_java_lang_VMClass_getSuperclass
+Java_java_lang_VMClass_getInterfaces
+Java_java_lang_VMClass_getDeclaredFields
+getDeclaredMethodsConstructors_helper
+Java_java_lang_VMClass_getDeclaredMethods
+Java_java_lang_VMClass_getDeclaredConstructors
+Java_java_lang_VMClass_isAssignableFrom
+Java_java_lang_VMClass_getClassLoader
+Java_java_lang_VMClass_getName
+Java_java_lang_VMClass_isInitialized
+Java_java_lang_VMClass_setInitialized
+Java_java_lang_VMClass_step7
+Java_java_lang_VMClass_step8
+Java_java_lang_VMClassLoader_getClassLoadingLock
+Java_java_lang_VMClassLoader_newClassLoaderVmData
+Java_java_lang_VMClassLoader_getPrimitiveArray
+Java_java_lang_VMClassLoader_getArray
+Java_java_lang_VMClassLoader_nativeDefineArray
+Java_java_lang_VMClassLoader_nativeDefineClass
+Java_java_lang_VMClassLoader_linkClass
+Java_java_lang_VMClassLoader_initializeClass
+Java_java_lang_VMClassLoader_nativeLoadClass
+Java_java_lang_VMClassLoader_nativeCreateArray
+Java_java_lang_VMClassLoader_getPrimitiveClass
+Java_java_lang_VMObject_notify
+Java_java_lang_VMObject_notifyAll
+Java_java_lang_VMObject_wait
+Java_java_lang_VMObject_clone
+Java_java_lang_VMSecurityManager_getClassContext
+Java_java_lang_VMSecurityManager_currentClassLoader
+Java_java_lang_VMSystem_identityHashCode
+Java_java_lang_VMSystem_arraycopy
+Java_java_lang_VirtualMachine_invokeMain
+Java_java_lang_VirtualMachine_print__Z
+Java_java_lang_VirtualMachine_print__B
+Java_java_lang_VirtualMachine_print__S
+Java_java_lang_VirtualMachine_print__C
+Java_java_lang_VirtualMachine_print__I
+Java_java_lang_VirtualMachine_print__J
+Java_java_lang_VirtualMachine_print__F
+Java_java_lang_VirtualMachine_print__D
+Java_java_lang_VirtualMachine_print__Ljava_lang_String_2
+Java_java_lang_VirtualMachine_println__Z
+Java_java_lang_VirtualMachine_println__B
+Java_java_lang_VirtualMachine_println__S
+Java_java_lang_VirtualMachine_println__C
+Java_java_lang_VirtualMachine_println__I
+Java_java_lang_VirtualMachine_println__J
+Java_java_lang_VirtualMachine_println__F
+Java_java_lang_VirtualMachine_println__D
+Java_java_lang_VirtualMachine_println__Ljava_lang_String_2
+Java_java_lang_reflect_Array_createObjectArray
+Java_java_lang_reflect_Constructor_nativeGetDeclaringClass
+Java_java_lang_reflect_Constructor_nativeGetModifiers
+Java_java_lang_reflect_Constructor_nativeGetExceptionTypes
+Java_java_lang_reflect_Constructor_constructNative
+Java_java_lang_reflect_Constructor_nativeGetDescriptor
+Java_java_lang_reflect_Field_nativeGetDeclaringClass
+Java_java_lang_reflect_Field_nativeGetModifiers
+Java_java_lang_reflect_Field_nativeGetType
+Java_java_lang_reflect_Field_nativeGetName
+Java_java_lang_reflect_Field_nativeGetBoolean
+Java_java_lang_reflect_Field_nativeGetReference
+Java_java_lang_reflect_Method_nativeGetDeclaringClass
+Java_java_lang_reflect_Method_nativeGetName
+Java_java_lang_reflect_Method_nativeGetModifiers
+Java_java_lang_reflect_Method_nativeGetExceptionTypes
+Java_java_lang_reflect_Method_invokeNative
+Java_java_lang_reflect_Method_nativeGetDescriptor
+
+:]m4svm_java_function_end
+
+----------------------------------------------------------------------
+file_tail
+----------------------------------------------------------------------
+
+m4svm_file_tail
+
Index: src/libsablevm/error.c
===================================================================
--- src/libsablevm/error.c (revision 1204)
+++ src/libsablevm/error.c (revision 1295)
@@ -8,10 +8,11 @@
Les quelques changements dans ce fichier ont pour but de s'assurer que, lorsque sablevm est configurer
avec l'option --enable-debugging-features(qui se veut une version sans utilisation de signaux), aucune en-tête
« C » relative au signaux n'est utilisée. Sans cette condition, sablevm ne compile pas pour l'instant.
/* We remember previously established signal handlers, so that we can
delegate back to them when we don't handle a signal. */
-static struct sigaction _svmv_old_sigquit;
#if defined(_SABLEVM_SIGNALS_FOR_EXCEPTIONS) || defined(_SABLEVM_INLINABILITY_TESTING)
+static struct sigaction _svmv_old_sigquit;
+
static struct sigaction _svmv_old_sigsegv;
static struct sigaction _svmv_old_sigfpe;
@@ -69,7 +70,6 @@
siglongjmp (*(env->signal_handler), 1);
}
-#endif /* _SABLEVM_SIGNALS_FOR_EXCEPTIONS || _SABLEVM_INLINABILITY_TESTING */
/*
----------------------------------------------------------------------
@@ -280,6 +280,9 @@
}
}
+#endif /* _SABLEVM_SIGNALS_FOR_EXCEPTIONS || _SABLEVM_INLINABILITY_TESTING */
+
+
/*
----------------------------------------------------------------------
_svmf_error_init
@@ -289,6 +292,9 @@
static jint
_svmf_error_init (void)
{
+
+#if defined(_SABLEVM_SIGNALS_FOR_EXCEPTIONS) || defined(_SABLEVM_INLINABILITY_TESTING)
+
struct sigaction sa;
_svmm_zero_memory (sa);
@@ -412,6 +418,8 @@
#endif /* _SABLEVM_INLINABILITY_TESTING */
+#endif /* _SABLEVM_SIGNALS_FOR_EXCEPTIONS || _SABLEVM_INLINABILITY_TESTING */
+
return JNI_OK;
error:
Index: src/libsablevm/splay_tree.list
===================================================================
--- src/libsablevm/splay_tree.list (revision 1204)
+++ src/libsablevm/splay_tree.list (revision 1295)
Ajout, à la liste des arbres binaires déjà mis en place, de l'arbre binaire
des fonctions exportées de libsablevm.
@@ -21,6 +21,7 @@
m4svm_splay_tree_begin[:
+function, _svmt_function_node
type, _svmt_type_node
gc_map, _svmt_gc_map_node
sequence, _svmt_sequence_node
Index: src/libsablevm/exported_functions.h
===================================================================
--- src/libsablevm/exported_functions.h (revision 0)
+++ src/libsablevm/exported_functions.h (revision 1295)
@@ -0,0 +1,14 @@
Ce nouveau fichier est le fichier d'en-tête du fichier exported_functions.c contenant
le prototype de la fonction responsable d'initialiser l'arbre binaire des fonctions
exportées de libsablevm.
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * This file is part of SableVM. *
+ * See the file "LICENSE" for Copyright information and the *
+ * terms and conditions for copying, distribution and *
+ * modification of SableVM. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef SVM_EXPORTED_FUNCTIONS_H
+#define SVM_EXPORTED_FUNCTIONS_H
+
+static jint
+m4svmf_initialize_functions_tree (_svmt_JNIEnv *env);
+
+#endif /* NOT SVM_EXPORTED_FUNCTIONS_H */
Index: src/libsablevm/types.h
===================================================================
--- src/libsablevm/types.h (revision 1204)
+++ src/libsablevm/types.h (revision 1295)
@@ -98,6 +98,7 @@
Définition d'un type à partir de la structure qui constitue un noeud de l'arbre binaire contenant les
fonctions exportées de libsablevm.
typedef struct _svmt_threads_struct _svmt_threads;
typedef struct _svmt_type_info_struct _svmt_type_info;
typedef struct _svmt_type_node_struct _svmt_type_node;
+typedef struct _svmt_function_node_struct _svmt_function_node;
typedef struct _svmt_unknown_attribute_struct _svmt_unknown_attribute;
typedef struct _svmt_vtable_struct _svmt_vtable;
typedef union _svmt_code_union _svmt_code;
@@ -392,6 +393,7 @@
Définition de la racine de l'arbre binaire contenant les fonctions exportées de libsablevm.
_svmt_type_node *initiated_type_tree;
_svmt_type_node *partially_derived_type_tree;
_svmt_class_file current_class_file;
+ _svmt_function_node *functions_tree_root;
_svmt_class_loader_info *class_loader_info;
};
@@ -1796,6 +1798,23 @@
Définition de la structure d'un noeud de l'arbre binaire contenant les fonctions exportées de libsablevm.
_svmt_type_node *right;
};
+/*
+----------------------------------------------------------------------
+-svmt_function_node
+----------------------------------------------------------------------
+*/
+struct _svmt_function_node_struct
+{
+ const char *name;
+ void (*code) (void);
+
+ _svmt_function_node *parent;
+ _svmt_function_node *left;
+ _svmt_function_node *right;
+
+};
+
+
/*
----------------------------------------------------------------------
_svmt_interface_method_signature_node
Index: src/libsablevm/libsablevm.c
===================================================================
--- src/libsablevm/libsablevm.c (revision 1204)
+++ src/libsablevm/libsablevm.c (revision 1295)
@@ -49,6 +49,7 @@
Inclusion du nouveau fichier d'en-tête exported_functions.h, dans libsablevm.c
#include "interpreter.h"
#include "method_invoke.h"
#include "new_instance.h"
+#include "exported_functions.h"
#include "cast.c"
#include "util1.c"
@@ -120,3 +121,5 @@
Inclusion du nouveau fichier exported_functions.c, dans libsablevm.c
#include "java_lang_reflect_Constructor.c"
#include "java_lang_reflect_Field.c"
#include "java_lang_reflect_Method.c"
+
+#include "exported_functions.c"
Index: src/libsablevm/native.c
===================================================================
--- src/libsablevm/native.c (revision 1204)
+++ src/libsablevm/native.c (revision 1295)
@@ -597,6 +597,57 @@
C'est ici que la recherche dans l'arbre binaire des fonctions expportées est utilisée. Lors
du parcours des librairies dynamiques,si le « handle » est NULL, la fonction est recherchée,
par son nom (court et long), directement dans l'arbre binaire.
/* process native libraries in loading order */
while (native_library != NULL)
{
+
+ if (native_library->handle == NULL)
+ {
+ /*the found function node*/
+ _svmt_function_node *function_node;
+ /*tmp node needed for the search in the tree(node key = name) */
+ _svmt_function_node tmp_node = { NULL, NULL, NULL, NULL, NULL };
+
+ /*try short name*/
+ tmp_node.name = method->data.native_method->short_name;
+
+ function_node = _svmm_tree_find_function (vm->class_loading.boot_loader.functions_tree_root,
+ &tmp_node);
+
+ if(function_node != NULL)
+ {
+ method->data.native_method->code = function_node->code;
+
+ if (method->data.native_method->code != NULL)
+ {
+ break;
+ }
+
+ }
+ else
+ {
+ method->data.native_method->code = NULL;
+ }
+
+ /*try long name */
+ tmp_node.name = method->data.native_method->long_name;
+
+ function_node = _svmm_tree_find_function (vm->class_loading.boot_loader.functions_tree_root,
+ &tmp_node);
+ if(function_node != NULL)
+ {
+ method->data.native_method->code = function_node->code;
+
+ if (method->data.native_method->code != NULL)
+ {
+ break;
+ }
+ }
+ else
+ {
+ /*method not found*/
+ method->data.native_method->code = NULL;
+ }
+
+ }
+
/* try short name */
method->data.native_method->code =
(void (*)(void)) lt_dlsym (native_library->handle,
Index: src/libsablevm/global_alloc.list
===================================================================
--- src/libsablevm/global_alloc.list (revision 1204)
+++ src/libsablevm/global_alloc.list (revision 1295)
@@ -46,6 +46,7 @@
Ajout pour la mise en place de l'arbre binaire(splay tree) contenant les fonctions exportées de libsablevm.
Relatif à l'allocation de mémoire.
memory_block, _svmt_memory_block
sequence_node, _svmt_sequence_node
type_node, _svmt_type_node
+function_node, _svmt_function_node
:]m4svm_global_zalloc_end
Index: src/libsablevm/interpreter.c
===================================================================
--- src/libsablevm/interpreter.c (revision 1204)
+++ src/libsablevm/interpreter.c (revision 1295)
@@ -633,6 +633,13 @@
L'appel de la fonction d'initialisation de l'arbre binaire contenant les
fonctions exportées de libsablevm.
#endif
+ /* initialization of the functions tree */
+ if (env->vm->class_loading.boot_loader.functions_tree_root == NULL)
+ {
+ m4svmf_initialize_functions_tree (env);
+ }
+
return JNI_OK;
}
}
+
Index: src/libsablevm/interpreter.h
===================================================================
--- src/libsablevm/interpreter.h (revision 1204)
+++ src/libsablevm/interpreter.h (revision 1295)
@@ -9,5 +9,6 @@
Ajout du prototype de la fonction d'initialisation de l'arbre binaire contenant les fonctions
exportées de libsablevm.
#define SVM_INTERPRETER_H
static jint _svmf_interpreter (_svmt_JNIEnv *_env);
+static jint initialize_functions_tree (_svmt_JNIEnv *env);
#endif /* NOT SVM_INTERPRETER_H */
Index: src/libsablevm/Makefile.am
===================================================================
--- src/libsablevm/Makefile.am (revision 1204)
+++ src/libsablevm/Makefile.am (revision 1295)
@@ -19,6 +19,11 @@
Définition d'une variable=-no-undefined sous Cygwin (et Mingw) seulement.
libsablevm_la_SOURCES = \
libsablevm.c
+## under Cygwin, forces libtool to create shared libraries (dll)
+if PLATFORM_WIN32
+no_undefined = -no-undefined
+endif
+
## We use m4 to generate some files and save ourselves
## a lot of boring typing. It's more fun to write
## m4 macros;-)
@@ -36,6 +41,7 @@
Ajustement du Makefile en fonction des nouveaux fichiers.
error_throwing.c \
global_alloc.c \
global_alloc.h \
+ exported_functions.c \
instructions_preparation_direct_threaded.c \
instructions_preparation_inlined_threaded.c \
instructions_preparation_switch_threaded.c \
@@ -60,6 +66,7 @@
Ajustement du Makefile en fonction des nouveaux fichiers.
error_throwing.c \
global_alloc.c \
global_alloc.h \
+ exported_functions.c \
instructions_preparation_direct_threaded.c \
instructions_preparation_inlined_threaded.c \
instructions_preparation_switch_threaded.c \
@@ -183,6 +190,11 @@
Ajustement du Makefile en fonction des nouveaux fichiers.
util.m4.c \
vm_args.m4.c
+exported_functions.c: macros.m4 exported_functions.list exported_functions.m4.c
+ rm -f exported_functions.c
+ m4 -P macros.m4 exported_functions.m4.c exported_functions.list > exported_functions.c
+ chmod a-w exported_functions.c
+
class_file_parser.c: macros.m4 class_file_parser.m4.c
rm -f class_file_parser.c
m4 -P macros.m4 class_file_parser.m4.c > class_file_parser.c
@@ -306,6 +318,7 @@
Ajustement du Makefile en fonction des nouveaux fichiers.
rm -f error_throwing.c
rm -f global_alloc.c
rm -f global_alloc.h
+ rm -f exported_functions.c
rm -f instructions_preparation_direct_threaded.c
rm -f instructions_preparation_inlined_threaded.c
rm -f instructions_preparation_switch_threaded.c
@@ -317,9 +330,10 @@
Retrait de -lrt pour la compilation.
Ajout de la variable no_undefined pour forcer la création de librairie dynamique sous Cygwin.
rm -f util.c
rm -f vm_args.c
-libsablevm_la_LIBADD = -lpthread -lm -lffi -lltdl -lrt
+libsablevm_la_LIBADD = -lpthread -lm -lffi -lltdl
+####### -lrt
-libsablevm_la_LDFLAGS = -version-info @LIBRARY_VERSION@
+libsablevm_la_LDFLAGS = -version-info @LIBRARY_VERSION@ $(no_undefined)
INCLUDES = \
-I@srcdir@/include -I@srcdir@/inlinability \




2.2.2 Détails des modifications pour le classpath

Index: native/jni/java-lang/Makefile.am
===================================================================
--- native/jni/java-lang/Makefile.am (revision 1203)
+++ native/jni/java-lang/Makefile.am (revision 1295)
@@ -1,3 +1,7 @@
Définition d'une variable=-no-undefined sous Cygwin (et Mingw) seulement.
Cette opération est répétée dans tous les fichiers suivants:
native/jni/classpath/Makefile.am
native/jni/java-nio/Makefile.am
native/jni/java-net/Makefile.am
native/jni/java-io/Makefile.am
native/jni/java-util/Makefile.am
native/jni/gtk-peer/Makefile.am
native/fdlibm/Makefile.am

+if PLATFORM_WIN32
+no_undefined = -no-undefined
+endif
+
pkglib_LTLIBRARIES = libjavalang.la libjavalangreflect.la
libjavalang_la_SOURCES = java_lang_VMSystem.c \
@@ -11,7 +15,7 @@
Ajout de la variable no_undefined pour forcer la création de librairie dynamique sous Cygwin.
Cette opération est répétée dans tous les fichiers suivants:
native/jni/classpath/Makefile.am
native/jni/java-nio/Makefile.am
native/jni/java-net/Makefile.am
native/jni/java-io/Makefile.am
native/jni/java-util/Makefile.am
native/jni/gtk-peer/Makefile.am
native/fdlibm/Makefile.am
libjavalang_la_LIBADD = $(wildcard $(top_builddir)/native/fdlibm/*.lo) \
$(top_builddir)/native/jni/classpath/jcl.lo
-libjavalang_la_LDFLAGS = -module -version-info @LIBVERSION@
+libjavalang_la_LDFLAGS = -module -version-info @LIBVERSION@ $(no_undefined)
libjavalangreflect_la_LDFLAGS = -module -version-info @LIBVERSION@
INCLUDES = -I. @EXTRA_INCLUDES@ \


Index: native/jni/Makefile.am
===================================================================
--- native/jni/Makefile.am (revision 1203)
+++ native/jni/Makefile.am (revision 1295)
@@ -1,7 +1,8 @@
Annulation de la compilation de gtk-peer. Cela posait problème à la compilation du classpath.
## Input file for automake to generate the Makefile.in used by configure
if CREATE_GTK_PEER_LIBRARIES
-SUBDIRS = classpath java-io java-lang java-net java-nio java-util gtk-peer
+#SUBDIRS = classpath java-io java-lang java-net java-nio java-util gtk-peer
+SUBDIRS = classpath java-io java-lang java-net java-nio java-util
else
SUBDIRS = classpath java-io java-lang java-net java-nio java-util
endif
Index: native/jni/java-util/java_util_TimeZone.c
===================================================================
--- native/jni/java-util/java_util_TimeZone.c (revision 1203)
+++ native/jni/java-util/java_util_TimeZone.c (revision 1295)
@@ -61,7 +61,7 @@
Ajout d'une condition, possiblement temporaire, pour permettre la compilation du classpath.
JNIEXPORT jstring JNICALL
Java_java_util_TimeZone_getDefaultTimeZoneId(JNIEnv *env, jclass clazz)
{
-#ifdef HAVE_TZNAME
+#if defined(HAVE_TZNAME) && !defined(__CYGWIN__)
char buffer[128];
int result;
jstring retval;
Index: java/lang/System.java
===================================================================
--- java/lang/System.java (revision 1203)
+++ java/lang/System.java (revision 1295)
@@ -674,7 +677,14 @@
Changement du « .so » par « .la » pour que l'extension corresponde à celle des librairies dynamiques
sous Cygwin.
*/
public static String mapLibraryName(String libname)
{
- return "lib" + libname + ".so";
+
+ /*
+ For the cygwin port, the extension of the dynamic library to load
+ is .la instead of .so. For the moment, it's hard coded but this
+ must be fixe in the future.
+ */
+ //return "lib" + libname + ".so";
+ return "lib" + libname + ".la";
}
} // class System
Index: vm/reference/java/lang/Runtime.java
===================================================================
--- vm/reference/java/lang/Runtime.java (revision 1203)
+++ vm/reference/java/lang/Runtime.java (revision 1295)
@@ -716,10 +720,17 @@
Changement du « .so » par « .la » pour que l'extension corresponde à celle des librairies dynamiques
sous Cygwin.
path += "/";
}
- String fullName = path + "lib" + libname + ".so";
+ /*
+ For the cygwin port, the extension of the dynamic library to load
+ is .la instead of .so. For the moment, it's hard coded but this
+ must be fixe in the future.
+ */
+ //String fullName = path + "lib" + libname + ".so";
+ String fullName = path + "lib" + libname + ".la";
//VirtualMachine.println("Trying to load: " + fullName);
- //try {
+ //try {
+
load (fullName);
//VirtualMachine.println("Was loaded: " + fullName);
//} catch (UnsatisfiedLinkError e) {
Index: configure.in
===================================================================
--- configure.in (revision 1203)
+++ configure.in (revision 1295)
@@ -54,13 +54,13 @@
Annulation de la compilation de gtk-peer pour facilité la compilation du
classpath.
dnl GTK native peer
dnl -----------------------------------------------------------
AC_ARG_ENABLE(gtk-peer,
-[ --enable-gtk-peer compile GTK native peers [default=yes]],
+[ --enable-gtk-peer compile GTK native peers [default=no]],
[case "${enableval}" in
yes) COMPILE_GTK_PEER=yes ;;
no) COMPILE_GTK_PEER=no ;;
*) COMPILE_GTK_PEER=yes ;;
esac],
-[COMPILE_GTK_PEER=yes])
+[COMPILE_GTK_PEER=no])
AM_CONDITIONAL(CREATE_JNI_LIBRARIES, test "x${COMPILE_JNI}" = xyes)
AM_CONDITIONAL(CREATE_CNI_LIBRARIES, test "x${COMPILE_CNI}" = xyes)
@@ -124,19 +125,19 @@
Mise en commentaires de trucs relatifs à gtk-peer pour facilité la compilation du classpath.
fi
dnl Check for AWT related glib/gtk/libart_lgpl
- if test "x${COMPILE_GTK_PEER}" = xyes; then
- m4_pattern_allow([AM_PATH_GTK_2_0])
- m4_pattern_allow([AM_PATH_GLIB_2_0])
- m4_ifdef([AM_PATH_GTK_2_0],
- [AM_PATH_GTK_2_0(2.2.0,,exit 1)],
- [AC_MSG_ERROR([No AM_PATH_GTK_2_0 macro found: use --disable-gtk-peer])])
- m4_ifdef([AM_PATH_GTK_2_0],
- [AM_PATH_GLIB_2_0(2.2.0,,exit 1,gthread)],
- [AC_MSG_ERROR([No AM_PATH_GLIB_2_0 macro found: use --disable-gtk-peer])])
- dnl XXX Fix me when libart.m4 has the compile test fixed!
- dnl enable_libarttest=no
- AM_PATH_LIBART(2.1.0,,exit 1)
- fi
+# if test "x${COMPILE_GTK_PEER}" = xyes; then
+# m4_pattern_allow([AM_PATH_GTK_2_0])
+# m4_pattern_allow([AM_PATH_GLIB_2_0])
+# m4_ifdef([AM_PATH_GTK_2_0],
+# [AM_PATH_GTK_2_0(2.2.0,,exit 1)],
+# [AC_MSG_ERROR([No AM_PATH_GTK_2_0 macro found: use --disable-gtk-peer])])
+# m4_ifdef([AM_PATH_GTK_2_0],
+# [AM_PATH_GLIB_2_0(2.2.0,,exit 1,gthread)],
+# [AC_MSG_ERROR([No AM_PATH_GLIB_2_0 macro found: use --disable-gtk-peer])])
+# dnl XXX Fix me when libart.m4 has the compile test fixed!
+# dnl enable_libarttest=no
+# AM_PATH_LIBART(2.1.0,,exit 1)
+# fi
fi
@@ -171,6 +172,21 @@
Définition du symbole=PLATEFORM_WIN32 si l'hôte est Cygwin(ou Mingw).
La définition de ce symbole servira, plus tard, dans les Makefiles, de condition
pour définir une variable nécessaire à la génération des librairies dynamiques sous
Cygwin.
dnl -----------------------------------------------------------
+dnl define for Cygwin/Win32 platform
+dnl -----------------------------------------------------------
+AC_MSG_CHECKING([for some Win32 platform])
+case "$host" in
+ *-*-mingw*|*-*-cygwin*)
+ platform_win32=yes
+ ;;
+ *)
+ platform_win32=no
+ ;;
+esac
+AC_MSG_RESULT([$platform_win32])
+AM_CONDITIONAL(PLATFORM_WIN32, test "$platform_win32" = "yes")
+
+dnl -----------------------------------------------------------
dnl Initialize maintainer mode
dnl -----------------------------------------------------------
AM_MAINTAINER_MODE



3. Deuxième étape: Port sous Windows

À faire

4. À faire

4.1 Port de sablevm sous Cygwin

4.2 Port de sablevm sous Windows

Tout reste à faire:

5. Contributions

Contributeur(trice)s

Nom

Brève description de la contribution

Etienne M. Gagnon

  • Consultant expert pour le port de sablevm sous Cygwin

Grzegorz B. Prokopski

  • Consultant expert pour le port de sablevm sous Cygwin



6. Annexes

6.1 Port sous Cygwin

6.1.1 Fichier diff de sablevm

Index: configure.ac
===================================================================
--- configure.ac (revision 1204)
+++ configure.ac (revision 1295)
@@ -6,6 +6,10 @@
dnl * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
AC_INIT([sablevm], [1.0.9], [http://www.sablevm.org/])
+
+dnl minimal version of autoconf under cygwin
+AC_PREREQ(2.52)
+
AM_INIT_AUTOMAKE(AC_PACKAGE_TARNAME, AC_PACKAGE_VERSION)
AM_CONFIG_HEADER(src/include/config.h)
@@ -258,6 +262,21 @@
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
+
+dnl defining macro (platform_win32) only for Cygwin or Mingw
+AC_MSG_CHECKING([for some Win32 platform])
+
+case "$host" in
+ *-*-mingw*|*-*-cygwin*)
+ platform_win32=yes
+ ;;
+ *)
+ platform_win32=no
+ ;;
+esac
+AC_MSG_RESULT([$platform_win32])
+AM_CONDITIONAL(PLATFORM_WIN32, test "$platform_win32" = "yes")
+
dnl TODO: we should allow user to force if the __clear_cache was used or not
case "$system_clear_cache" in
yes)AC_DEFINE(HAS_SYSTEM_CLEAR_CACHE,1,use __clear_cache) ;;
Index: src/libsablevm/util2.c
===================================================================
--- src/libsablevm/util2.c (revision 1204)
+++ src/libsablevm/util2.c (revision 1295)
@@ -446,6 +446,22 @@
/*
----------------------------------------------------------------------
+_svmf_tree_compare_function
+----------------------------------------------------------------------
+*/
+inline static jint
+_svmf_tree_compare_function (_svmt_function_node * value1,
+ _svmt_function_node * value2)
+{
+ assert (value1 != NULL);
+ assert (value2 != NULL);
+
+ return strcmp (value1->name, value2->name);
+
+}
+
+/*
+----------------------------------------------------------------------
_svmf_tree_compare_interface_method_signature
----------------------------------------------------------------------
*/
Index: src/libsablevm/exported_functions.m4.c
===================================================================
--- src/libsablevm/exported_functions.m4.c (revision 0)
+++ src/libsablevm/exported_functions.m4.c (revision 1295)
@@ -0,0 +1,72 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * This file is part of SableVM. *
+ * See the file "LICENSE" for Copyright information and the *
+ * terms and conditions for copying, distribution and *
+ * modification of SableVM. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+----------------------------------------------------------------------
+m4svm_file_head
+----------------------------------------------------------------------
+*/
+
+m4svm_define_begin v = ":], [:m4svm_file_head:])";
+
+static jint
+m4svmf_initialize_functions_tree (_svmt_JNIEnv *env)
+{
+ /*node to insert in the functions splay tree*/
+ _svmt_function_node *function_node = NULL;
+
+ /*
+ * Stocking the pointer to each function to export from
+ * libsablevm in a splay tree
+ */
+
+ m4svm_define_end v = ":])";
+
+/*
+----------------------------------------------------------------------
+m4svm_file_tail
+----------------------------------------------------------------------
+*/
+
+ m4svm_define_begin v = ":], [:m4svm_file_tail:])";
+ return JNI_OK;
+}
+
+m4svm_define_end v = ":])";
+
+/*
+----------------------------------------------------------------------
+m4svm_java_function
+----------------------------------------------------------------------
+*/
+
+/*
+ * This macro can be multi-called.
+ * m4svm_multicall(m4svm_java_function)
+ */
+
+void
+M4svm_java_function ()
+{
+
+ m4svm_define_begin v = ":], [:m4svm_java_function:])";
+
+ /* Put address of $1 into splay tree */
+
+ if (_svmm_gzalloc_function_node (env, function_node) != JNI_OK)
+ {
+ return JNI_ERR;
+ }
+
+ function_node->name = "$1";
+ function_node->code = (void (*)(void))$1;
+
+ _svmm_tree_insert_function (env->vm->class_loading.boot_loader.functions_tree_root, function_node);
+
+ m4svm_define_end v = ":])";
+
+}
Index: src/libsablevm/invoke_interface.c
===================================================================
--- src/libsablevm/invoke_interface.c (revision 1204)
+++ src/libsablevm/invoke_interface.c (revision 1295)
@@ -360,6 +360,7 @@
goto error;
}
+ /*
vm->class_loading.boot_loader.class_loader_info->native_library_list->
handle = lt_dlopen (NULL);
if (vm->class_loading.boot_loader.class_loader_info->native_library_list->
@@ -367,6 +368,14 @@
{
goto error;
}
+
+ In this particular case, instead of libsablevm dlopen itself, we
+ initialize the handle to NULL and this case will be manage in the function
+ _svmf_bind_native_method in native.c: if the handle is null, search
+ the handle in the functions splay tree (trying with short and long name).
+ */
+ vm->class_loading.boot_loader.class_loader_info->native_library_list->
+ handle = NULL;
/* time to bootstrap! */
if (_svmf_bootstrap (env) != JNI_OK)
Index: src/libsablevm/exported_functions.list
===================================================================
--- src/libsablevm/exported_functions.list (revision 0)
+++ src/libsablevm/exported_functions.list (revision 1295)
@@ -0,0 +1,141 @@
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * This file is part of SableVM. *
+ * See the file "LICENSE" for Copyright information and the *
+ * terms and conditions for copying, distribution and *
+ * modification of SableVM. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+
+----------------------------------------------------------------------
+head
+----------------------------------------------------------------------
+
+m4svm_file_name
+
+----------------------------------------------------------------------
+file_head
+----------------------------------------------------------------------
+
+m4svm_file_head
+
+----------------------------------------------------------------------
+list of internal java function
+----------------------------------------------------------------------
+
+m4svm_java_function_begin[:
+
+JNI_GetDefaultJavaVMInitArgs
+JNI_GetCreatedJavaVMs
+JNI_CreateJavaVM
+Java_java_io_VMObjectStreamClass_hasClassInitializer
+Java_java_lang_Object_getClass
+Java_java_lang_ProcessImpl_nativeWaitFor
+Java_java_lang_Runtime_availableProcessors
+Java_java_lang_Runtime_freeMemory
+Java_java_lang_Runtime_totalMemory
+Java_java_lang_Runtime_maxMemory
+Java_java_lang_Runtime_execInternal
+Java_java_lang_Runtime_exitInternal
+Java_java_lang_Runtime_runFinalization
+Java_java_lang_Runtime_gc
+Java_java_lang_Runtime_traceInstructions
+Java_java_lang_Runtime_traceMethodCalls
+Java_java_lang_Runtime_nativeLoad
+Java_java_lang_Runtime_getBootstrapClassPath
+Java_java_lang_Runtime_getBootstrapLibraryPath
+Java_java_lang_Runtime_getSableVMVersion
+Java_java_lang_Runtime_getFileSeparator
+Java_java_lang_Runtime_getPathSeparator
+Java_java_lang_Runtime_getLineSeparator
+Java_java_lang_Runtime_getUserName
+Java_java_lang_Runtime_getUserHome
+Java_java_lang_Runtime_getWorkDir
+Java_java_lang_Runtime_getPropertyCount
+Java_java_lang_Runtime_getProperty
+Java_java_lang_SecurityManager_getClassContext
+Java_java_lang_VMThread_yield
+Java_java_lang_VMThread_nativeIsAlive
+Java_java_lang_VMThread_nativeStart
+Java_java_lang_VMThread_currentThread
+Java_java_lang_Throwable_nativeGetStackTraceList
+Java_java_lang_VMClass_isArray
+Java_java_lang_VMClass_isInstance
+Java_java_lang_VMClass_getModifiers
+Java_java_lang_VMClass_isInterface
+Java_java_lang_VMClass_getSuperclass
+Java_java_lang_VMClass_getInterfaces
+Java_java_lang_VMClass_getDeclaredFields
+getDeclaredMethodsConstructors_helper
+Java_java_lang_VMClass_getDeclaredMethods
+Java_java_lang_VMClass_getDeclaredConstructors
+Java_java_lang_VMClass_isAssignableFrom
+Java_java_lang_VMClass_getClassLoader
+Java_java_lang_VMClass_getName
+Java_java_lang_VMClass_isInitialized
+Java_java_lang_VMClass_setInitialized
+Java_java_lang_VMClass_step7
+Java_java_lang_VMClass_step8
+Java_java_lang_VMClassLoader_getClassLoadingLock
+Java_java_lang_VMClassLoader_newClassLoaderVmData
+Java_java_lang_VMClassLoader_getPrimitiveArray
+Java_java_lang_VMClassLoader_getArray
+Java_java_lang_VMClassLoader_nativeDefineArray
+Java_java_lang_VMClassLoader_nativeDefineClass
+Java_java_lang_VMClassLoader_linkClass
+Java_java_lang_VMClassLoader_initializeClass
+Java_java_lang_VMClassLoader_nativeLoadClass
+Java_java_lang_VMClassLoader_nativeCreateArray
+Java_java_lang_VMClassLoader_getPrimitiveClass
+Java_java_lang_VMObject_notify
+Java_java_lang_VMObject_notifyAll
+Java_java_lang_VMObject_wait
+Java_java_lang_VMObject_clone
+Java_java_lang_VMSecurityManager_getClassContext
+Java_java_lang_VMSecurityManager_currentClassLoader
+Java_java_lang_VMSystem_identityHashCode
+Java_java_lang_VMSystem_arraycopy
+Java_java_lang_VirtualMachine_invokeMain
+Java_java_lang_VirtualMachine_print__Z
+Java_java_lang_VirtualMachine_print__B
+Java_java_lang_VirtualMachine_print__S
+Java_java_lang_VirtualMachine_print__C
+Java_java_lang_VirtualMachine_print__I
+Java_java_lang_VirtualMachine_print__J
+Java_java_lang_VirtualMachine_print__F
+Java_java_lang_VirtualMachine_print__D
+Java_java_lang_VirtualMachine_print__Ljava_lang_String_2
+Java_java_lang_VirtualMachine_println__Z
+Java_java_lang_VirtualMachine_println__B
+Java_java_lang_VirtualMachine_println__S
+Java_java_lang_VirtualMachine_println__C
+Java_java_lang_VirtualMachine_println__I
+Java_java_lang_VirtualMachine_println__J
+Java_java_lang_VirtualMachine_println__F
+Java_java_lang_VirtualMachine_println__D
+Java_java_lang_VirtualMachine_println__Ljava_lang_String_2
+Java_java_lang_reflect_Array_createObjectArray
+Java_java_lang_reflect_Constructor_nativeGetDeclaringClass
+Java_java_lang_reflect_Constructor_nativeGetModifiers
+Java_java_lang_reflect_Constructor_nativeGetExceptionTypes
+Java_java_lang_reflect_Constructor_constructNative
+Java_java_lang_reflect_Constructor_nativeGetDescriptor
+Java_java_lang_reflect_Field_nativeGetDeclaringClass
+Java_java_lang_reflect_Field_nativeGetModifiers
+Java_java_lang_reflect_Field_nativeGetType
+Java_java_lang_reflect_Field_nativeGetName
+Java_java_lang_reflect_Field_nativeGetBoolean
+Java_java_lang_reflect_Field_nativeGetReference
+Java_java_lang_reflect_Method_nativeGetDeclaringClass
+Java_java_lang_reflect_Method_nativeGetName
+Java_java_lang_reflect_Method_nativeGetModifiers
+Java_java_lang_reflect_Method_nativeGetExceptionTypes
+Java_java_lang_reflect_Method_invokeNative
+Java_java_lang_reflect_Method_nativeGetDescriptor
+
+:]m4svm_java_function_end
+
+----------------------------------------------------------------------
+file_tail
+----------------------------------------------------------------------
+
+m4svm_file_tail
+
Index: src/libsablevm/error.c
===================================================================
--- src/libsablevm/error.c (revision 1204)
+++ src/libsablevm/error.c (revision 1295)
@@ -8,10 +8,11 @@
/* We remember previously established signal handlers, so that we can
delegate back to them when we don't handle a signal. */
-static struct sigaction _svmv_old_sigquit;
#if defined(_SABLEVM_SIGNALS_FOR_EXCEPTIONS) || defined(_SABLEVM_INLINABILITY_TESTING)
+static struct sigaction _svmv_old_sigquit;
+
static struct sigaction _svmv_old_sigsegv;
static struct sigaction _svmv_old_sigfpe;
@@ -69,7 +70,6 @@
siglongjmp (*(env->signal_handler), 1);
}
-#endif /* _SABLEVM_SIGNALS_FOR_EXCEPTIONS || _SABLEVM_INLINABILITY_TESTING */
/*
----------------------------------------------------------------------
@@ -280,6 +280,9 @@
}
}
+#endif /* _SABLEVM_SIGNALS_FOR_EXCEPTIONS || _SABLEVM_INLINABILITY_TESTING */
+
+
/*
----------------------------------------------------------------------
_svmf_error_init
@@ -289,6 +292,9 @@
static jint
_svmf_error_init (void)
{
+
+#if defined(_SABLEVM_SIGNALS_FOR_EXCEPTIONS) || defined(_SABLEVM_INLINABILITY_TESTING)
+
struct sigaction sa;
_svmm_zero_memory (sa);
@@ -412,6 +418,8 @@
#endif /* _SABLEVM_INLINABILITY_TESTING */
+#endif /* _SABLEVM_SIGNALS_FOR_EXCEPTIONS || _SABLEVM_INLINABILITY_TESTING */
+
return JNI_OK;
error:
Index: src/libsablevm/splay_tree.list
===================================================================
--- src/libsablevm/splay_tree.list (revision 1204)
+++ src/libsablevm/splay_tree.list (revision 1295)
@@ -21,6 +21,7 @@
m4svm_splay_tree_begin[:
+function, _svmt_function_node
type, _svmt_type_node
gc_map, _svmt_gc_map_node
sequence, _svmt_sequence_node
Index: src/libsablevm/exported_functions.h
===================================================================
--- src/libsablevm/exported_functions.h (revision 0)
+++ src/libsablevm/exported_functions.h (revision 1295)
@@ -0,0 +1,14 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * This file is part of SableVM. *
+ * See the file "LICENSE" for Copyright information and the *
+ * terms and conditions for copying, distribution and *
+ * modification of SableVM. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef SVM_EXPORTED_FUNCTIONS_H
+#define SVM_EXPORTED_FUNCTIONS_H
+
+static jint
+m4svmf_initialize_functions_tree (_svmt_JNIEnv *env);
+
+#endif /* NOT SVM_EXPORTED_FUNCTIONS_H */
Index: src/libsablevm/types.h
===================================================================
--- src/libsablevm/types.h (revision 1204)
+++ src/libsablevm/types.h (revision 1295)
@@ -98,6 +98,7 @@
typedef struct _svmt_threads_struct _svmt_threads;
typedef struct _svmt_type_info_struct _svmt_type_info;
typedef struct _svmt_type_node_struct _svmt_type_node;
+typedef struct _svmt_function_node_struct _svmt_function_node;
typedef struct _svmt_unknown_attribute_struct _svmt_unknown_attribute;
typedef struct _svmt_vtable_struct _svmt_vtable;
typedef union _svmt_code_union _svmt_code;
@@ -392,6 +393,7 @@
_svmt_type_node *initiated_type_tree;
_svmt_type_node *partially_derived_type_tree;
_svmt_class_file current_class_file;
+ _svmt_function_node *functions_tree_root;
_svmt_class_loader_info *class_loader_info;
};
@@ -1796,6 +1798,23 @@
_svmt_type_node *right;
};
+/*
+----------------------------------------------------------------------
+-svmt_function_node
+----------------------------------------------------------------------
+*/
+struct _svmt_function_node_struct
+{
+ const char *name;
+ void (*code) (void);
+
+ _svmt_function_node *parent;
+ _svmt_function_node *left;
+ _svmt_function_node *right;
+
+};
+
+
/*
----------------------------------------------------------------------
_svmt_interface_method_signature_node
Index: src/libsablevm/libsablevm.c
===================================================================
--- src/libsablevm/libsablevm.c (revision 1204)
+++ src/libsablevm/libsablevm.c (revision 1295)
@@ -49,6 +49,7 @@
#include "interpreter.h"
#include "method_invoke.h"
#include "new_instance.h"
+#include "exported_functions.h"
#include "cast.c"
#include "util1.c"
@@ -120,3 +121,5 @@
#include "java_lang_reflect_Constructor.c"
#include "java_lang_reflect_Field.c"
#include "java_lang_reflect_Method.c"
+
+#include "exported_functions.c"
Index: src/libsablevm/native.c
===================================================================
--- src/libsablevm/native.c (revision 1204)
+++ src/libsablevm/native.c (revision 1295)
@@ -597,6 +597,57 @@
/* process native libraries in loading order */
while (native_library != NULL)
{
+
+ if (native_library->handle == NULL)
+ {
+ /*the found function node*/
+ _svmt_function_node *function_node;
+ /*tmp node needed for the search in the tree(node key = name) */
+ _svmt_function_node tmp_node = { NULL, NULL, NULL, NULL, NULL };
+
+ /*try short name*/
+ tmp_node.name = method->data.native_method->short_name;
+
+ function_node = _svmm_tree_find_function (vm->class_loading.boot_loader.functions_tree_root,
+ &tmp_node);
+
+ if(function_node != NULL)
+ {
+ method->data.native_method->code = function_node->code;
+
+ if (method->data.native_method->code != NULL)
+ {
+ break;
+ }
+
+ }
+ else
+ {
+ method->data.native_method->code = NULL;
+ }
+
+ /*try long name */
+ tmp_node.name = method->data.native_method->long_name;
+
+ function_node = _svmm_tree_find_function (vm->class_loading.boot_loader.functions_tree_root,
+ &tmp_node);
+ if(function_node != NULL)
+ {
+ method->data.native_method->code = function_node->code;
+
+ if (method->data.native_method->code != NULL)
+ {
+ break;
+ }
+ }
+ else
+ {
+ /*method not found*/
+ method->data.native_method->code = NULL;
+ }
+
+ }
+
/* try short name */
method->data.native_method->code =
(void (*)(void)) lt_dlsym (native_library->handle,
Index: src/libsablevm/global_alloc.list
===================================================================
--- src/libsablevm/global_alloc.list (revision 1204)
+++ src/libsablevm/global_alloc.list (revision 1295)
@@ -46,6 +46,7 @@
memory_block, _svmt_memory_block
sequence_node, _svmt_sequence_node
type_node, _svmt_type_node
+function_node, _svmt_function_node
:]m4svm_global_zalloc_end
Index: src/libsablevm/interpreter.c
===================================================================
--- src/libsablevm/interpreter.c (revision 1204)
+++ src/libsablevm/interpreter.c (revision 1295)
@@ -633,6 +633,13 @@
#endif
+ /* initialization of the functions tree */
+ if (env->vm->class_loading.boot_loader.functions_tree_root == NULL)
+ {
+ m4svmf_initialize_functions_tree (env);
+ }
+
return JNI_OK;
}
}
+
Index: src/libsablevm/interpreter.h
===================================================================
--- src/libsablevm/interpreter.h (revision 1204)
+++ src/libsablevm/interpreter.h (revision 1295)
@@ -9,5 +9,6 @@
#define SVM_INTERPRETER_H
static jint _svmf_interpreter (_svmt_JNIEnv *_env);
+static jint initialize_functions_tree (_svmt_JNIEnv *env);
#endif /* NOT SVM_INTERPRETER_H */
Index: src/libsablevm/Makefile.am
===================================================================
--- src/libsablevm/Makefile.am (revision 1204)
+++ src/libsablevm/Makefile.am (revision 1295)
@@ -19,6 +19,11 @@
libsablevm_la_SOURCES = \
libsablevm.c
+## under Cygwin, forces libtool to create shared libraries (dll)
+if PLATFORM_WIN32
+no_undefined = -no-undefined
+endif
+
## We use m4 to generate some files and save ourselves
## a lot of boring typing. It's more fun to write
## m4 macros;-)
@@ -36,6 +41,7 @@
error_throwing.c \
global_alloc.c \
global_alloc.h \
+ exported_functions.c \
instructions_preparation_direct_threaded.c \
instructions_preparation_inlined_threaded.c \
instructions_preparation_switch_threaded.c \
@@ -60,6 +66,7 @@
error_throwing.c \
global_alloc.c \
global_alloc.h \
+ exported_functions.c \
instructions_preparation_direct_threaded.c \
instructions_preparation_inlined_threaded.c \
instructions_preparation_switch_threaded.c \
@@ -183,6 +190,11 @@
util.m4.c \
vm_args.m4.c
+exported_functions.c: macros.m4 exported_functions.list exported_functions.m4.c
+ rm -f exported_functions.c
+ m4 -P macros.m4 exported_functions.m4.c exported_functions.list > exported_functions.c
+ chmod a-w exported_functions.c
+
class_file_parser.c: macros.m4 class_file_parser.m4.c
rm -f class_file_parser.c
m4 -P macros.m4 class_file_parser.m4.c > class_file_parser.c
@@ -306,6 +318,7 @@
rm -f error_throwing.c
rm -f global_alloc.c
rm -f global_alloc.h
+ rm -f exported_functions.c
rm -f instructions_preparation_direct_threaded.c
rm -f instructions_preparation_inlined_threaded.c
rm -f instructions_preparation_switch_threaded.c
@@ -317,9 +330,10 @@
rm -f util.c
rm -f vm_args.c
-libsablevm_la_LIBADD = -lpthread -lm -lffi -lltdl -lrt
+libsablevm_la_LIBADD = -lpthread -lm -lffi -lltdl
+####### -lrt
-libsablevm_la_LDFLAGS = -version-info @LIBRARY_VERSION@
+libsablevm_la_LDFLAGS = -version-info @LIBRARY_VERSION@ $(no_undefined)
INCLUDES = \
-I@srcdir@/include -I@srcdir@/inlinability \




6.1.2 Fichier diff de sablevm-classpath

Index: native/jni/java-lang/Makefile.am
===================================================================
--- native/jni/java-lang/Makefile.am (revision 1203)
+++ native/jni/java-lang/Makefile.am (revision 1295)
@@ -1,3 +1,7 @@
+if PLATFORM_WIN32
+no_undefined = -no-undefined
+endif
+
pkglib_LTLIBRARIES = libjavalang.la libjavalangreflect.la
libjavalang_la_SOURCES = java_lang_VMSystem.c \
@@ -11,7 +15,7 @@
libjavalang_la_LIBADD = $(wildcard $(top_builddir)/native/fdlibm/*.lo) \
$(top_builddir)/native/jni/classpath/jcl.lo
-libjavalang_la_LDFLAGS = -module -version-info @LIBVERSION@
+libjavalang_la_LDFLAGS = -module -version-info @LIBVERSION@ $(no_undefined)
libjavalangreflect_la_LDFLAGS = -module -version-info @LIBVERSION@
INCLUDES = -I. @EXTRA_INCLUDES@ \
Index: native/jni/classpath/Makefile.am
===================================================================
--- native/jni/classpath/Makefile.am (revision 1203)
+++ native/jni/classpath/Makefile.am (revision 1295)
@@ -1,3 +1,7 @@
+if PLATFORM_WIN32
+no_undefined = -no-undefined
+endif
+
noinst_LTLIBRARIES = libclasspath.la
libclasspath_la_SOURCES = jcl.c jcl.h \
@@ -5,7 +9,7 @@
primlib.c primlib.h \
native_state.c native_state.h
-libclasspath_la_LDFLAGS = -module -version-info @LIBVERSION@
+libclasspath_la_LDFLAGS = -module -version-info @LIBVERSION@ $(no_undefined)
INCLUDES = -I. @EXTRA_INCLUDES@ \
-I$(top_srcdir)/include \
Index: native/jni/java-nio/Makefile.am
===================================================================
--- native/jni/java-nio/Makefile.am (revision 1203)
+++ native/jni/java-nio/Makefile.am (revision 1295)
@@ -1,3 +1,7 @@
+if PLATFORM_WIN32
+no_undefined = -no-undefined
+endif
+
pkglib_LTLIBRARIES = libjavanio.la
libjavanio_la_SOURCES = java_nio_DirectByteBufferImpl.c \
@@ -4,7 +8,7 @@
java_nio_FileChannelImpl.c \
java_nio_FileLockImpl.c
-libjavanio_la_LDFLAGS = -module -version-info @LIBVERSION@
+libjavanio_la_LDFLAGS = -module -version-info @LIBVERSION@ $(no_undefined)
libjavanio_la_LIBADD = $(top_builddir)/native/jni/classpath/jcl.lo
INCLUDES = -I. @EXTRA_INCLUDES@ \
Index: native/jni/java-net/Makefile.am
===================================================================
--- native/jni/java-net/Makefile.am (revision 1203)
+++ native/jni/java-net/Makefile.am (revision 1295)
@@ -1,3 +1,7 @@
+if PLATFORM_WIN32
+no_undefined = -no-undefined
+endif
+
pkglib_LTLIBRARIES = libjavanet.la
libjavanet_la_SOURCES = javanet.c \
@@ -7,7 +11,7 @@
gnu_java_net_PlainDatagramSocketImpl.c \
gnu_java_net_PlainSocketImpl.c
-libjavanet_la_LDFLAGS = -module -version-info @LIBVERSION@
+libjavanet_la_LDFLAGS = -module -version-info @LIBVERSION@ $(no_undefined)
libjavanet_la_LIBADD = $(top_builddir)/native/jni/classpath/jcl.lo
INCLUDES = -I. @EXTRA_INCLUDES@ \
Index: native/jni/java-io/Makefile.am
===================================================================
--- native/jni/java-io/Makefile.am (revision 1203)
+++ native/jni/java-io/Makefile.am (revision 1295)
@@ -1,3 +1,7 @@
+if PLATFORM_WIN32
+no_undefined = -no-undefined
+endif
+
pkglib_LTLIBRARIES = libjavaio.la
libjavaio_la_SOURCES = javaio.h \
@@ -6,7 +10,7 @@
FileDescriptor.c \
java_io_ObjectInputStream.c
-libjavaio_la_LDFLAGS = -module -version-info @LIBVERSION@
+libjavaio_la_LDFLAGS = -module -version-info @LIBVERSION@ $(no_undefined)
libjavaio_la_LIBADD = $(top_builddir)/native/jni/classpath/jcl.lo
INCLUDES = -I. @EXTRA_INCLUDES@ \
Index: native/jni/Makefile.am
===================================================================
--- native/jni/Makefile.am (revision 1203)
+++ native/jni/Makefile.am (revision 1295)
@@ -1,7 +1,8 @@
## Input file for automake to generate the Makefile.in used by configure
if CREATE_GTK_PEER_LIBRARIES
-SUBDIRS = classpath java-io java-lang java-net java-nio java-util gtk-peer
+#SUBDIRS = classpath java-io java-lang java-net java-nio java-util gtk-peer
+SUBDIRS = classpath java-io java-lang java-net java-nio java-util
else
SUBDIRS = classpath java-io java-lang java-net java-nio java-util
endif
Index: native/jni/java-util/Makefile.am
===================================================================
--- native/jni/java-util/Makefile.am (revision 1203)
+++ native/jni/java-util/Makefile.am (revision 1295)
@@ -1,3 +1,7 @@
+if PLATFORM_WIN32
+no_undefined = -no-undefined
+endif
+
pkglib_LTLIBRARIES = libjavautil.la
libjavautil_la_SOURCES = java_util_TimeZone.c
@@ -2,3 +6,3 @@
-libjavautil_la_LDFLAGS = -module -version-info @LIBVERSION@
+libjavautil_la_LDFLAGS = -module -version-info @LIBVERSION@ $(no_undefined)
Index: native/jni/java-util/java_util_TimeZone.c
===================================================================
--- native/jni/java-util/java_util_TimeZone.c (revision 1203)
+++ native/jni/java-util/java_util_TimeZone.c (revision 1295)
@@ -61,7 +61,7 @@
JNIEXPORT jstring JNICALL
Java_java_util_TimeZone_getDefaultTimeZoneId(JNIEnv *env, jclass clazz)
{
-#ifdef HAVE_TZNAME
+#if defined(HAVE_TZNAME) && !defined(__CYGWIN__)
char buffer[128];
int result;
jstring retval;
Index: native/jni/gtk-peer/Makefile.am
===================================================================
--- native/jni/gtk-peer/Makefile.am (revision 1203)
+++ native/jni/gtk-peer/Makefile.am (revision 1295)
@@ -1,3 +1,7 @@
+if PLATFORM_WIN32
+no_undefined = -no-undefined
+endif
+
pkglib_LTLIBRARIES = libgtkpeer.la
libgtkpeer_la_SOURCES = \
@@ -33,7 +37,7 @@
gtkpeer.h
libgtkpeer_la_LIBADD = $(top_builddir)/native/jni/classpath/native_state.lo
-libgtkpeer_la_LDFLAGS = -module -version-info @LIBVERSION@ @GTK_LIBS@ @GLIB_LIBS@ @LIBART_LIBS@
+libgtkpeer_la_LDFLAGS = -module -version-info @LIBVERSION@ @GTK_LIBS@ @GLIB_LIBS@ @LIBART_LIBS@ $(no_undefined)
INCLUDES = -I. @EXTRA_INCLUDES@ \
@GTK_CFLAGS@ \
Index: native/fdlibm/Makefile.am
===================================================================
--- native/fdlibm/Makefile.am (revision 1203)
+++ native/fdlibm/Makefile.am (revision 1295)
@@ -1,3 +1,7 @@
+if PLATFORM_WIN32
+no_undefined = -no-undefined
+endif
+
noinst_LTLIBRARIES = libfdlibm.la
libfdlibm_la_SOURCES = \
@@ -45,7 +49,7 @@
w_remainder.c \
w_sqrt.c
-libfdlibm_la_LDFLAGS = -module -version-info @LIBVERSION@
+libfdlibm_la_LDFLAGS = -module -version-info @LIBVERSION@ $(no_undefined)
INCLUDES = @EXTRA_INCLUDES@ \
-I$(top_builddir)/include
Index: java/lang/System.java
===================================================================
--- java/lang/System.java (revision 1203)
+++ java/lang/System.java (revision 1295)
@@ -674,7 +677,14 @@
*/
public static String mapLibraryName(String libname)
{
- return "lib" + libname + ".so";
+
+ /*
+ For the cygwin port, the extension of the dynamic library to load
+ is .la instead of .so. For the moment, it's hard coded but this
+ must be fixe in the future.
+ */
+ //return "lib" + libname + ".so";
+ return "lib" + libname + ".la";
}
} // class System
Index: vm/reference/java/lang/Runtime.java
===================================================================
--- vm/reference/java/lang/Runtime.java (revision 1203)
+++ vm/reference/java/lang/Runtime.java (revision 1295)
@@ -716,10 +720,17 @@
path += "/";
}
- String fullName = path + "lib" + libname + ".so";
+ /*
+ For the cygwin port, the extension of the dynamic library to load
+ is .la instead of .so. For the moment, it's hard coded but this
+ must be fixe in the future.
+ */
+ //String fullName = path + "lib" + libname + ".so";
+ String fullName = path + "lib" + libname + ".la";
//VirtualMachine.println("Trying to load: " + fullName);
- //try {
+ //try {
+
load (fullName);
//VirtualMachine.println("Was loaded: " + fullName);
//} catch (UnsatisfiedLinkError e) {
Index: configure.in
===================================================================
--- configure.in (revision 1203)
+++ configure.in (revision 1295)
@@ -54,13 +54,13 @@
dnl GTK native peer
dnl -----------------------------------------------------------
AC_ARG_ENABLE(gtk-peer,
-[ --enable-gtk-peer compile GTK native peers [default=yes]],
+[ --enable-gtk-peer compile GTK native peers [default=no]],
[case "${enableval}" in
yes) COMPILE_GTK_PEER=yes ;;
no) COMPILE_GTK_PEER=no ;;
*) COMPILE_GTK_PEER=yes ;;
esac],
-[COMPILE_GTK_PEER=yes])
+[COMPILE_GTK_PEER=no])
AM_CONDITIONAL(CREATE_JNI_LIBRARIES, test "x${COMPILE_JNI}" = xyes)
AM_CONDITIONAL(CREATE_CNI_LIBRARIES, test "x${COMPILE_CNI}" = xyes)
@@ -124,19 +125,19 @@
fi
dnl Check for AWT related glib/gtk/libart_lgpl
- if test "x${COMPILE_GTK_PEER}" = xyes; then
- m4_pattern_allow([AM_PATH_GTK_2_0])
- m4_pattern_allow([AM_PATH_GLIB_2_0])
- m4_ifdef([AM_PATH_GTK_2_0],
- [AM_PATH_GTK_2_0(2.2.0,,exit 1)],
- [AC_MSG_ERROR([No AM_PATH_GTK_2_0 macro found: use --disable-gtk-peer])])
- m4_ifdef([AM_PATH_GTK_2_0],
- [AM_PATH_GLIB_2_0(2.2.0,,exit 1,gthread)],
- [AC_MSG_ERROR([No AM_PATH_GLIB_2_0 macro found: use --disable-gtk-peer])])
- dnl XXX Fix me when libart.m4 has the compile test fixed!
- dnl enable_libarttest=no
- AM_PATH_LIBART(2.1.0,,exit 1)
- fi
+# if test "x${COMPILE_GTK_PEER}" = xyes; then
+# m4_pattern_allow([AM_PATH_GTK_2_0])
+# m4_pattern_allow([AM_PATH_GLIB_2_0])
+# m4_ifdef([AM_PATH_GTK_2_0],
+# [AM_PATH_GTK_2_0(2.2.0,,exit 1)],
+# [AC_MSG_ERROR([No AM_PATH_GTK_2_0 macro found: use --disable-gtk-peer])])
+# m4_ifdef([AM_PATH_GTK_2_0],
+# [AM_PATH_GLIB_2_0(2.2.0,,exit 1,gthread)],
+# [AC_MSG_ERROR([No AM_PATH_GLIB_2_0 macro found: use --disable-gtk-peer])])
+# dnl XXX Fix me when libart.m4 has the compile test fixed!
+# dnl enable_libarttest=no
+# AM_PATH_LIBART(2.1.0,,exit 1)
+# fi
fi
@@ -171,6 +172,21 @@
dnl -----------------------------------------------------------
+dnl define for Cygwin/Win32 platform
+dnl -----------------------------------------------------------
+AC_MSG_CHECKING([for some Win32 platform])
+case "$host" in
+ *-*-mingw*|*-*-cygwin*)
+ platform_win32=yes
+ ;;
+ *)
+ platform_win32=no
+ ;;
+esac
+AC_MSG_RESULT([$platform_win32])
+AM_CONDITIONAL(PLATFORM_WIN32, test "$platform_win32" = "yes")
+
+dnl -----------------------------------------------------------
dnl Initialize maintainer mode
dnl -----------------------------------------------------------
AM_MAINTAINER_MODE



6.2 Port sous windows