* configure.ac: New switch for disabling -O2 (--disable-optimizations).
[cacao.git] / src / native / vm / nativevm.cpp
1 /* src/native/vm/nativevm.cpp - Register native VM interface functions.
2
3    Copyright (C) 2007, 2008
4    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
5
6    This file is part of CACAO.
7
8    This program is free software; you can redistribute it and/or
9    modify it under the terms of the GNU General Public License as
10    published by the Free Software Foundation; either version 2, or (at
11    your option) any later version.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23 */
24
25
26 #include "config.h"
27
28 #include <stdint.h>
29
30 #include "native/vm/nativevm.hpp"
31
32 #include "vm/class.hpp"
33 #include "vm/exceptions.hpp"
34 #include "vm/initialize.hpp"
35 #include "vm/method.hpp"
36 #include "vm/options.h"
37 #include "vm/os.hpp"
38
39 #if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
40 # include "mm/memory.hpp"
41
42 # include "native/native.hpp"
43
44 # include "native/vm/openjdk/hpi.hpp"
45
46 # include "toolbox/sequence.hpp"
47
48 # include "vm/globals.hpp"
49 # include "vm/properties.hpp"
50 # include "vm/utf8.h"
51 # include "vm/vm.hpp"
52 #endif
53
54
55 /* nativevm_preinit ************************************************************
56
57    Pre-initialize the implementation specific native stuff.
58
59 *******************************************************************************/
60
61 void nativevm_preinit(void)
62 {
63         TRACESUBSYSTEMINITIALIZATION("nativevm_preinit");
64
65         /* Register native methods of all classes implemented. */
66
67 #if defined(ENABLE_JAVASE)
68 # if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
69
70         _Jv_gnu_classpath_VMStackWalker_init();
71         _Jv_gnu_classpath_VMSystemProperties_init();
72         _Jv_gnu_java_lang_VMCPStringBuilder_init();
73         _Jv_gnu_java_lang_management_VMClassLoadingMXBeanImpl_init();
74         _Jv_gnu_java_lang_management_VMMemoryMXBeanImpl_init();
75         _Jv_gnu_java_lang_management_VMRuntimeMXBeanImpl_init();
76         _Jv_gnu_java_lang_management_VMThreadMXBeanImpl_init();
77         _Jv_java_lang_VMClass_init();
78         _Jv_java_lang_VMClassLoader_init();
79         _Jv_java_lang_VMObject_init();
80         _Jv_java_lang_VMRuntime_init();
81         _Jv_java_lang_VMSystem_init();
82         _Jv_java_lang_VMString_init();
83         _Jv_java_lang_VMThread_init();
84         _Jv_java_lang_VMThrowable_init();
85         _Jv_java_lang_management_VMManagementFactory_init();
86         _Jv_java_lang_reflect_VMConstructor_init();
87         _Jv_java_lang_reflect_VMField_init();
88         _Jv_java_lang_reflect_VMMethod_init();
89         //_Jv_java_lang_reflect_VMProxy_init();
90         _Jv_java_security_VMAccessController_init();
91         _Jv_java_util_concurrent_atomic_AtomicLong_init();
92         _Jv_sun_misc_Unsafe_init();
93
94 #if defined(ENABLE_ANNOTATIONS)
95         _Jv_sun_reflect_ConstantPool_init();
96 #endif
97
98 # elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
99
100         // Load libjava.so
101         VM* vm = VM::get_current();
102         Properties& properties = vm->get_properties();
103         const char* boot_library_path = properties.get("sun.boot.library.path");
104
105         // Use sequence builder to assemble library path.
106         SequenceBuilder sb;
107
108         sb.cat(boot_library_path);
109         sb.cat("/libjava.so");
110
111         // XXX This should actually be sb.export_symbol()
112         utf* u = utf_new_char(sb.c_str());
113
114         NativeLibrary nl(u);
115         void* handle = nl.open();
116
117         if (handle == NULL)
118                 os::abort("nativevm_init: failed to open libjava.so at: %s", sb.c_str());
119
120         NativeLibraries& nls = vm->get_nativelibraries();
121         nls.add(nl);
122
123         // Initialize the HPI.
124         HPI& hpi = vm->get_hpi();
125         hpi.initialize();
126
127         _Jv_sun_misc_Perf_init();
128         _Jv_sun_misc_Unsafe_init();
129
130 #  if !defined(NDEBUG)
131         // Sanity check current time in milliseconds, because negative values
132         // might confuse OpenJDKs sanity checks.
133         if (opt_PrintWarnings && (builtin_currenttimemillis() < 0))
134                 log_println("nativevm_preinit: Current time in milliseconds is negative, please check your time!");
135 #  endif
136
137 # else
138 #  error unknown classpath configuration
139 # endif
140
141 #elif defined(ENABLE_JAVAME_CLDC1_1)
142
143         _Jv_com_sun_cldc_io_ResourceInputStream_init();
144         _Jv_com_sun_cldc_io_j2me_socket_Protocol_init();
145         _Jv_com_sun_cldchi_io_ConsoleOutputStream_init();
146         _Jv_com_sun_cldchi_jvm_JVM_init();
147         _Jv_java_lang_Class_init();
148         _Jv_java_lang_Double_init();
149         _Jv_java_lang_Float_init();
150         _Jv_java_lang_Math_init();
151         _Jv_java_lang_Object_init();
152         _Jv_java_lang_Runtime_init();
153         _Jv_java_lang_String_init();
154         _Jv_java_lang_System_init();
155         _Jv_java_lang_Thread_init();
156         _Jv_java_lang_Throwable_init();
157
158 #else
159 # error unknown Java configuration
160 #endif
161 }
162
163
164 /* nativevm_init ***************************************************************
165
166    Initialize the implementation specific native stuff.
167
168 *******************************************************************************/
169
170 bool nativevm_init(void)
171 {
172         TRACESUBSYSTEMINITIALIZATION("nativevm_init");
173
174 #if defined(ENABLE_JAVASE)
175
176 # if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
177
178         // Nothing to do.
179
180 # elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
181
182         methodinfo* m = class_resolveclassmethod(class_java_lang_System,
183                                                                                          utf_new_char("initializeSystemClass"),
184                                                                                          utf_void__void,
185                                                                                          class_java_lang_Object,
186                                                                                          false);
187
188         if (m == NULL)
189                 return false;
190
191         (void) vm_call_method(m, NULL);
192
193         if (exceptions_get_exception() != NULL)
194                 return false;
195
196 # else
197 #  error unknown classpath configuration
198 # endif
199
200 #elif defined(ENABLE_JAVAME_CLDC1_1)
201
202         // Nothing to do.
203
204 #else
205 # error unknown Java configuration
206 #endif
207
208         return true;
209 }
210
211
212 /*
213  * These are local overrides for various environment variables in Emacs.
214  * Please do not remove this and leave it at the end of the file, where
215  * Emacs will automagically detect them.
216  * ---------------------------------------------------------------------
217  * Local variables:
218  * mode: c++
219  * indent-tabs-mode: t
220  * c-basic-offset: 4
221  * tab-width: 4
222  * End:
223  * vim:noexpandtab:sw=4:ts=4:
224  */