2 * Copyright (C) 2008 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * Variables with library scope.
20 * Prefer this over scattered static and global variables -- it's easier to
21 * view the state in a debugger, it makes clean shutdown simpler, we can
22 * trivially dump the state into a crash log, and it dodges most naming
23 * collisions that will arise when we are embedded in a larger program.
25 * If we want multiple VMs per process, this can get stuffed into TLS (or
26 * accessed through a Thread field). May need to pass it around for some
27 * of the early initialization functions.
29 #ifndef _DALVIK_GLOBALS
30 #define _DALVIK_GLOBALS
35 #define MAX_BREAKPOINTS 20 /* used for a debugger optimization */
37 /* private structures */
38 typedef struct GcHeap GcHeap;
39 typedef struct BreakpointSet BreakpointSet;
40 typedef struct InlineSub InlineSub;
43 * One of these for each -ea/-da/-esa/-dsa on the command line.
45 typedef struct AssertionControl {
46 char* pkgOrClass; /* package/class string, or NULL for esa/dsa */
47 int pkgOrClassLen; /* string length, for quick compare */
48 bool enable; /* enable or disable */
49 bool isPackage; /* string ended with "..."? */
53 * Execution mode, e.g. interpreter vs. JIT.
55 typedef enum ExecutionMode {
56 kExecutionModeUnknown = 0,
57 kExecutionModeInterpPortable,
58 kExecutionModeInterpFast,
65 * All fields are initialized to zero.
67 * Storage allocated here must be freed by a subsystem shutdown function or
68 * from within freeGlobals().
72 * Some options from the command line or environment.
74 char* bootClassPathStr;
77 unsigned int heapSizeStart;
78 unsigned int heapSizeMax;
79 unsigned int stackSize;
86 bool jdwpAllowed; // debugging allowed for this process?
87 bool jdwpConfigured; // has debugging info been provided?
94 /* use wall clock as method profiler clock source? */
95 bool profilerWallClock;
98 * Lock profiling threshold value in milliseconds. Acquires that
99 * exceed threshold are logged. Acquires within the threshold are
100 * logged with a probability of $\frac{time}{threshold}$ . If the
101 * threshold is unset no additional logging occurs.
103 u4 lockProfThreshold;
105 int (*vfprintfHook)(FILE*, const char*, va_list);
106 void (*exitHook)(int);
107 void (*abortHook)(void);
109 int jniGrefLimit; // 0 means no limit
113 bool verifyDexChecksum;
114 char* stackTraceFile; // for SIGQUIT-inspired output
118 DexOptimizerMode dexOptMode;
119 DexClassVerifyMode classVerifyMode;
129 bool generateRegisterMaps;
130 bool concurrentMarkSweep;
131 bool verifyCardTable;
133 int assertionCtrlCount;
134 AssertionControl* assertionCtrl;
136 ExecutionMode executionMode;
139 * VM init management.
142 int initExceptionCount;
146 * java.lang.System properties set from the command line.
153 * Where the VM goes to find system classes.
155 ClassPathEntry* bootClassPath;
156 /* used by the DEX optimizer to load classes from an unfinished DEX */
157 DvmDex* bootClassPathOptExtra;
158 bool optimizingBootstrapClass;
161 * Loaded classes, hashed by class name. Each entry is a ClassObject*,
162 * allocated in GC space.
164 HashTable* loadedClasses;
167 * Value for the next class serial number to be assigned. This is
168 * incremented as we load classes. Failed loads and races may result
169 * in some numbers being skipped, and the serial number is not
170 * guaranteed to start at 1, so the current value should not be used
171 * as a count of loaded classes.
173 volatile int classSerialNumber;
176 * Classes with a low classSerialNumber are probably in the zygote, and
177 * their InitiatingLoaderList is not used, to promote sharing. The list is
180 InitiatingLoaderList* initiatingLoaderList;
186 /* A mutex that guards access to the interned string tables. */
187 pthread_mutex_t internLock;
189 /* Hash table of strings interned by the user. */
190 HashTable* internedStrings;
192 /* Hash table of strings interned by the class loader. */
193 HashTable* literalStrings;
196 * Quick lookups for popular classes used internally.
198 ClassObject* classJavaLangClass;
199 ClassObject* classJavaLangClassArray;
200 ClassObject* classJavaLangError;
201 ClassObject* classJavaLangObject;
202 ClassObject* classJavaLangObjectArray;
203 ClassObject* classJavaLangRuntimeException;
204 ClassObject* classJavaLangString;
205 ClassObject* classJavaLangThread;
206 ClassObject* classJavaLangVMThread;
207 ClassObject* classJavaLangThreadGroup;
208 ClassObject* classJavaLangThrowable;
209 ClassObject* classJavaLangStackOverflowError;
210 ClassObject* classJavaLangStackTraceElement;
211 ClassObject* classJavaLangStackTraceElementArray;
212 ClassObject* classJavaLangAnnotationAnnotationArray;
213 ClassObject* classJavaLangAnnotationAnnotationArrayArray;
214 ClassObject* classJavaLangReflectAccessibleObject;
215 ClassObject* classJavaLangReflectConstructor;
216 ClassObject* classJavaLangReflectConstructorArray;
217 ClassObject* classJavaLangReflectField;
218 ClassObject* classJavaLangReflectFieldArray;
219 ClassObject* classJavaLangReflectMethod;
220 ClassObject* classJavaLangReflectMethodArray;
221 ClassObject* classJavaLangReflectProxy;
222 ClassObject* classJavaLangExceptionInInitializerError;
223 ClassObject* classJavaLangRefPhantomReference;
224 ClassObject* classJavaLangRefReference;
225 ClassObject* classJavaNioReadWriteDirectByteBuffer;
226 ClassObject* classJavaSecurityAccessController;
227 ClassObject* classOrgApacheHarmonyLangAnnotationAnnotationFactory;
228 ClassObject* classOrgApacheHarmonyLangAnnotationAnnotationMember;
229 ClassObject* classOrgApacheHarmonyLangAnnotationAnnotationMemberArray;
230 ClassObject* classOrgApacheHarmonyNioInternalDirectBuffer;
231 jclass jclassOrgApacheHarmonyNioInternalDirectBuffer;
233 /* synthetic classes for arrays of primitives */
234 ClassObject* classArrayBoolean;
235 ClassObject* classArrayChar;
236 ClassObject* classArrayFloat;
237 ClassObject* classArrayDouble;
238 ClassObject* classArrayByte;
239 ClassObject* classArrayShort;
240 ClassObject* classArrayInt;
241 ClassObject* classArrayLong;
243 /* method offsets - Object */
244 int voffJavaLangObject_equals;
245 int voffJavaLangObject_hashCode;
246 int voffJavaLangObject_toString;
247 int voffJavaLangObject_finalize;
249 /* field offsets - Class */
250 int offJavaLangClass_pd;
252 /* field offsets - String */
253 int javaLangStringReady; /* 0=not init, 1=ready, -1=initing */
254 int offJavaLangString_value;
255 int offJavaLangString_count;
256 int offJavaLangString_offset;
257 int offJavaLangString_hashCode;
259 /* field offsets - Thread */
260 int offJavaLangThread_vmThread;
261 int offJavaLangThread_group;
262 int offJavaLangThread_daemon;
263 int offJavaLangThread_name;
264 int offJavaLangThread_priority;
266 /* method offsets - Thread */
267 int voffJavaLangThread_run;
269 /* field offsets - VMThread */
270 int offJavaLangVMThread_thread;
271 int offJavaLangVMThread_vmData;
273 /* method offsets - ThreadGroup */
274 int voffJavaLangThreadGroup_removeThread;
276 /* field offsets - Throwable */
277 int offJavaLangThrowable_stackState;
278 int offJavaLangThrowable_message;
279 int offJavaLangThrowable_cause;
281 /* field offsets - java.lang.reflect.* */
282 int offJavaLangReflectAccessibleObject_flag;
283 int offJavaLangReflectConstructor_slot;
284 int offJavaLangReflectConstructor_declClass;
285 int offJavaLangReflectField_slot;
286 int offJavaLangReflectField_declClass;
287 int offJavaLangReflectMethod_slot;
288 int offJavaLangReflectMethod_declClass;
290 /* field offsets - java.lang.ref.Reference */
291 int offJavaLangRefReference_referent;
292 int offJavaLangRefReference_queue;
293 int offJavaLangRefReference_queueNext;
294 int offJavaLangRefReference_pendingNext;
296 /* method pointers - java.lang.ref.Reference */
297 Method* methJavaLangRefReference_enqueueInternal;
299 /* field offsets - java.nio.Buffer and java.nio.DirectByteBufferImpl */
300 //int offJavaNioBuffer_capacity;
301 //int offJavaNioDirectByteBufferImpl_pointer;
303 /* method pointers - java.security.AccessController */
304 volatile int javaSecurityAccessControllerReady;
305 Method* methJavaSecurityAccessController_doPrivileged[4];
307 /* constructor method pointers; no vtable involved, so use Method* */
308 Method* methJavaLangStackTraceElement_init;
309 Method* methJavaLangExceptionInInitializerError_init;
310 Method* methJavaLangRefPhantomReference_init;
311 Method* methJavaLangReflectConstructor_init;
312 Method* methJavaLangReflectField_init;
313 Method* methJavaLangReflectMethod_init;
314 Method* methOrgApacheHarmonyLangAnnotationAnnotationMember_init;
316 /* static method pointers - android.lang.annotation.* */
318 methOrgApacheHarmonyLangAnnotationAnnotationFactory_createAnnotation;
320 /* direct method pointers - java.lang.reflect.Proxy */
321 Method* methJavaLangReflectProxy_constructorPrototype;
323 /* field offsets - java.lang.reflect.Proxy */
324 int offJavaLangReflectProxy_h;
326 /* fake native entry point method */
327 Method* methFakeNativeEntry;
329 /* assorted direct buffer helpers */
330 Method* methJavaNioReadWriteDirectByteBuffer_init;
331 Method* methOrgApacheHarmonyLuniPlatformPlatformAddress_on;
332 Method* methOrgApacheHarmonyNioInternalDirectBuffer_getEffectiveAddress;
333 int offJavaNioBuffer_capacity;
334 int offJavaNioBuffer_effectiveDirectAddress;
335 int offOrgApacheHarmonyLuniPlatformPlatformAddress_osaddr;
336 int voffOrgApacheHarmonyLuniPlatformPlatformAddress_toLong;
339 * VM-synthesized primitive classes, for arrays.
341 ClassObject* volatile primitiveClass[PRIM_MAX];
344 * Thread list. This always has at least one element in it (main),
345 * and main is always the first entry.
347 * The threadListLock is used for several things, including the thread
348 * start condition variable. Generally speaking, you must hold the
349 * threadListLock when:
350 * - adding/removing items from the list
351 * - waiting on or signaling threadStartCond
352 * - examining the Thread struct for another thread (this is to avoid
353 * one thread freeing the Thread struct while another thread is
357 pthread_mutex_t threadListLock;
359 pthread_cond_t threadStartCond;
362 * The thread code grabs this before suspending all threads. There
363 * are a few things that can cause a "suspend all":
364 * (1) the GC is starting;
365 * (2) the debugger has sent a "suspend all" request;
366 * (3) a thread has hit a breakpoint or exception that the debugger
367 * has marked as a "suspend all" event;
368 * (4) the SignalCatcher caught a signal that requires suspension.
369 * (5) (if implemented) the JIT needs to perform a heavyweight
370 * rearrangement of the translation cache or JitTable.
372 * Because we use "safe point" self-suspension, it is never safe to
373 * do a blocking "lock" call on this mutex -- if it has been acquired,
374 * somebody is probably trying to put you to sleep. The leading '_' is
375 * intended as a reminder that this lock is special.
377 pthread_mutex_t _threadSuspendLock;
380 * Guards Thread->suspendCount for all threads, and provides the lock
381 * for the condition variable that all suspended threads sleep on
382 * (threadSuspendCountCond).
384 * This has to be separate from threadListLock because of the way
385 * threads put themselves to sleep.
387 pthread_mutex_t threadSuspendCountLock;
390 * Suspended threads sleep on this. They should sleep on the condition
391 * variable until their "suspend count" is zero.
393 * Paired with "threadSuspendCountLock".
395 pthread_cond_t threadSuspendCountCond;
398 * Sum of all threads' suspendCount fields. The JIT needs to know if any
399 * thread is suspended. Guarded by threadSuspendCountLock.
401 int sumThreadSuspendCount;
404 * MUTEX ORDERING: when locking multiple mutexes, always grab them in
405 * this order to avoid deadlock:
407 * (1) _threadSuspendLock (use lockThreadSuspend())
408 * (2) threadListLock (use dvmLockThreadList())
409 * (3) threadSuspendCountLock (use lockThreadSuspendCount())
414 * Thread ID bitmap. We want threads to have small integer IDs so
415 * we can use them in "thin locks".
417 BitVector* threadIdMap;
420 * Manage exit conditions. The VM exits when all non-daemon threads
421 * have exited. If the main thread returns early, we need to sleep
422 * on a condition variable.
424 int nonDaemonThreadCount; /* must hold threadListLock to access */
425 //pthread_mutex_t vmExitLock;
426 pthread_cond_t vmExitCond;
429 * The set of DEX files loaded by custom class loaders.
431 HashTable* userDexFiles;
434 * JNI global reference table.
436 #ifdef USE_INDIRECT_REF
437 IndirectRefTable jniGlobalRefTable;
439 ReferenceTable jniGlobalRefTable;
441 pthread_mutex_t jniGlobalRefLock;
442 int jniGlobalRefHiMark;
443 int jniGlobalRefLoMark;
446 * JNI pinned object table (used for primitive arrays).
448 ReferenceTable jniPinRefTable;
449 pthread_mutex_t jniPinRefLock;
452 * Native shared library table.
454 HashTable* nativeLibs;
457 * GC heap lock. Functions like gcMalloc() acquire this before making
458 * any changes to the heap. It is held throughout garbage collection.
460 pthread_mutex_t gcHeapLock;
463 * Condition variable to queue threads waiting to retry an
464 * allocation. Signaled after a concurrent GC is completed.
466 pthread_cond_t gcHeapCond;
468 /* Opaque pointer representing the heap. */
471 /* The card table base, modified as needed for marking cards. */
472 u1* biasedCardTableBase;
475 * Pre-allocated throwables.
477 Object* outOfMemoryObj;
478 Object* internalErrorObj;
479 Object* noClassDefFoundErrorObj;
481 /* Monitor list, so we can free them */
482 /*volatile*/ Monitor* monitorList;
484 /* Monitor for Thread.sleep() implementation */
485 Monitor* threadSleepMon;
487 /* set when we create a second heap inside the zygote */
488 bool newZygoteHeapAllocated;
493 pthread_key_t pthreadKeySelf; /* Thread*, for dvmThreadSelf */
496 * JNI allows you to have multiple VMs, but we limit ourselves to 1,
497 * so "vmList" is really just a pointer to the one and only VM.
502 * Cache results of "A instanceof B".
504 AtomicCache* instanceofCache;
506 /* instruction width table, used for optimization and verification */
507 InstructionWidth* instrWidth;
508 /* instruction flags table, used for verification */
509 InstructionFlags* instrFlags;
510 /* instruction format table, used for verification */
511 InstructionFormat* instrFormat;
513 /* inline substitution table, used during optimization */
514 InlineSub* inlineSubs;
517 * Bootstrap class loader linear allocator.
519 LinearAllocHdr* pBootLoaderAlloc;
523 * Heap worker thread.
525 bool heapWorkerInitialized;
526 bool heapWorkerReady;
528 pthread_t heapWorkerHandle;
529 pthread_mutex_t heapWorkerLock;
530 pthread_cond_t heapWorkerCond;
531 pthread_cond_t heapWorkerIdleCond;
532 pthread_mutex_t heapWorkerListLock;
535 * Compute some stats on loaded classes.
537 int numLoadedClasses;
538 int numDeclaredMethods;
539 int numDeclaredInstFields;
540 int numDeclaredStaticFields;
542 /* when using a native debugger, set this to suppress watchdog timers */
543 bool nativeDebuggerActive;
546 * JDWP debugger support.
548 * Note "debuggerActive" is accessed from mterp, so its storage size and
549 * meaning must not be changed without updating the assembly sources.
551 bool debuggerConnected; /* debugger or DDMS is connected */
552 u1 debuggerActive; /* debugger is making requests */
553 JdwpState* jdwpState;
556 * Registry of objects known to the debugger.
558 HashTable* dbgRegistry;
561 * Debugger breakpoint table.
563 BreakpointSet* breakpointSet;
566 * Single-step control struct. We currently only allow one thread to
567 * be single-stepping at a time, which is all that really makes sense,
568 * but it's possible we may need to expand this to be per-thread.
570 StepControl stepControl;
573 * DDM features embedded in the VM.
575 bool ddmThreadNotification;
578 * Zygote (partially-started process) support
583 * Used for tracking allocations that we report to DDMS. When the feature
584 * is enabled (through a DDMS request) the "allocRecords" pointer becomes
587 pthread_mutex_t allocTrackerLock;
588 AllocRecord* allocRecords;
589 int allocRecordHead; /* most-recently-added entry */
590 int allocRecordCount; /* #of valid entries */
592 #ifdef WITH_ALLOC_LIMITS
593 /* set on first use of an alloc limit, never cleared */
594 bool checkAllocLimits;
595 /* allocation limit, for setGlobalAllocationLimit() regression testing */
599 #ifdef WITH_DEADLOCK_PREDICTION
600 /* global lock on history tree accesses */
601 pthread_mutex_t deadlockHistoryLock;
603 enum { kDPOff=0, kDPWarn, kDPErr, kDPAbort } deadlockPredictMode;
607 * When a profiler is enabled, this is incremented. Distinct profilers
608 * include "dmtrace" method tracing, emulator method tracing, and
609 * possibly instruction counting.
611 * The purpose of this is to have a single value that the interpreter
612 * can check to see if any profiling activity is enabled.
614 volatile int activeProfilers;
617 * State for method-trace profiling.
619 MethodTraceState methodTrace;
622 * State for emulator tracing.
624 void* emulatorTracePage;
625 int emulatorTraceEnableCount;
628 * Global state for memory allocation profiling.
630 AllocProfState allocProf;
633 * Pointers to the original methods for things that have been inlined.
634 * This makes it easy for us to output method entry/exit records for
635 * the method calls we're not actually making. (Used by method
638 Method** inlinedMethods;
641 * Dalvik instruction counts (256 entries).
643 int* executedInstrCounts;
644 bool instructionCountEnableCount;
647 * Signal catcher thread (for SIGQUIT).
649 pthread_t signalCatcherHandle;
650 bool haltSignalCatcher;
653 * Stdout/stderr conversion thread.
655 bool haltStdioConverter;
656 bool stdioConverterReady;
657 pthread_t stdioConverterHandle;
658 pthread_mutex_t stdioConverterLock;
659 pthread_cond_t stdioConverterCond;
662 * pid of the system_server process. We track it so that when system server
663 * crashes the Zygote process will be killed and restarted.
665 pid_t systemServerPid;
667 int kernelGroupScheduling;
669 //#define COUNT_PRECISE_METHODS
670 #ifdef COUNT_PRECISE_METHODS
671 PointerSet* preciseMethods;
674 /* some RegisterMap statistics, useful during development */
675 void* registerMapStats;
678 extern struct DvmGlobals gDvm;
680 #if defined(WITH_JIT)
683 * Exiting the compiled code w/o chaining will incur overhead to look up the
684 * target in the code cache which is extra work only when JIT is enabled. So
685 * we want to monitor it closely to make sure we don't have performance bugs.
687 typedef enum NoChainExits {
688 kInlineCacheMiss = 0,
689 kCallsiteInterpreted,
696 * JIT-specific global state
698 struct DvmJitGlobals {
700 * Guards writes to Dalvik PC (dPC), translated code address (codeAddr) and
701 * chain fields within the JIT hash table. Note carefully the access
703 * Only writes are guarded, and the guarded fields must be updated in a
704 * specific order using atomic operations. Further, once a field is
705 * written it cannot be changed without halting all threads.
707 * The write order is:
710 * 3) chain [if necessary]
712 * This mutex also guards both read and write of curJitTableEntries.
714 pthread_mutex_t tableLock;
716 /* The JIT hash table. Note that for access speed, copies of this pointer
717 * are stored in each thread. */
718 struct JitEntry *pJitEntryTable;
720 /* Array of profile threshold counters */
721 unsigned char *pProfTable;
723 /* Copy of pProfTable used for temporarily disabling the Jit */
724 unsigned char *pProfTableCopy;
726 /* Size of JIT hash table in entries. Must be a power of 2 */
727 unsigned int jitTableSize;
729 /* Mask used in hash function for JitTable. Should be jitTableSize-1 */
730 unsigned int jitTableMask;
732 /* How many entries in the JitEntryTable are in use */
733 unsigned int jitTableEntriesUsed;
735 /* Bytes allocated for the code cache */
736 unsigned int codeCacheSize;
738 /* Trigger for trace selection */
739 unsigned short threshold;
741 /* JIT Compiler Control */
742 bool haltCompilerThread;
744 pthread_t compilerHandle;
745 pthread_mutex_t compilerLock;
746 pthread_mutex_t compilerICPatchLock;
747 pthread_cond_t compilerQueueActivity;
748 pthread_cond_t compilerQueueEmpty;
749 volatile int compilerQueueLength;
750 int compilerHighWater;
751 int compilerWorkEnqueueIndex;
752 int compilerWorkDequeueIndex;
753 int compilerICPatchIndex;
755 /* JIT internal stats */
756 int compilerMaxQueued;
757 int translationChains;
759 /* Compiled code cache */
762 /* Bytes used by the code templates */
763 unsigned int templateSize;
765 /* Bytes already used in the code cache */
766 unsigned int codeCacheByteUsed;
768 /* Number of installed compilations in the cache */
769 unsigned int numCompilations;
771 /* Flag to indicate that the code cache is full */
775 unsigned int pageSizeMask;
777 /* Lock to change the protection type of the code cache */
778 pthread_mutex_t codeCacheProtectionLock;
780 /* Number of times that the code cache has been reset */
781 int numCodeCacheReset;
783 /* Number of times that the code cache reset request has been delayed */
784 int numCodeCacheResetDelayed;
786 /* true/false: compile/reject opcodes specified in the -Xjitop list */
787 bool includeSelectedOp;
789 /* true/false: compile/reject methods specified in the -Xjitmethod list */
790 bool includeSelectedMethod;
792 /* Disable JIT for selected opcodes - one bit for each opcode */
795 /* Disable JIT for selected methods */
796 HashTable *methodTable;
798 /* Flag to dump all compiled code */
801 /* Flag to count trace execution */
804 /* Vector to disable selected optimizations */
807 /* Table to track the overall and trace statistics of hot methods */
808 HashTable* methodStatsTable;
810 /* Filter method compilation blacklist with call-graph information */
813 /* New translation chain has been set up */
814 volatile bool hasNewChain;
816 #if defined(WITH_SELF_VERIFICATION)
817 /* Spin when error is detected, volatile so GDB can reset it */
818 volatile bool selfVerificationSpin;
821 /* Framework or stand-alone? */
822 bool runningInAndroidFramework;
824 /* Framework callback happened? */
825 bool alreadyEnabledViaFramework;
827 /* Framework requests to disable the JIT for good */
830 #if defined(SIGNATURE_BREAKPOINT)
831 /* Signature breakpoint */
832 u4 signatureBreakpointSize; // # of words
833 u4 *signatureBreakpoint; // Signature content
836 #if defined(WITH_JIT_TUNING)
837 /* Performance tuning counters */
838 int addrLookupsFound;
839 int addrLookupsNotFound;
840 int noChainExit[kNoChainExitLast];
843 int invokeMonomorphic;
844 int invokePolymorphic;
846 int invokeMonoGetterInlined;
847 int invokeMonoSetterInlined;
848 int invokePolyGetterInlined;
849 int invokePolySetterInlined;
857 int codeCachePatches;
860 /* Place arrays at the end to ease the display in gdb sessions */
862 /* Work order queue for compilations */
863 CompilerWorkOrder compilerWorkQueue[COMPILER_WORK_QUEUE_SIZE];
865 /* Work order queue for predicted chain patching */
866 ICPatchWorkOrder compilerICPatchQueue[COMPILER_IC_PATCH_QUEUE_SIZE];
869 extern struct DvmJitGlobals gDvmJit;
871 #if defined(WITH_JIT_TUNING)
872 extern int gDvmICHitCount;
877 #endif /*_DALVIK_GLOBALS*/