* src/vm/jit/stack.c (GET_NEW_VAR): Fixed macro argument.
[cacao.git] / src / vm / statistics.c
index 81f17c5c39df37f1c3397358fa169093fb0d892c..6dafa4b379063306766d2997c387bc27d5c64173 100644 (file)
@@ -1,9 +1,9 @@
 /* src/vm/statistics.c - global varables for statistics
 
-   Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
-   R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
-   C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
-   Institut f. Computersprachen - TU Wien
+   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+   C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
+   E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
+   J. Wenninger, Institut f. Computersprachen - TU Wien
 
    This file is part of CACAO.
 
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
 
-   Contact: cacao@complang.tuwien.ac.at
+   Contact: cacao@cacaojvm.org
 
    Authors: Christian Thalinger
 
-   $Id: statistics.c 2026 2005-03-10 13:31:37Z twisti $
+   Changes:
+
+   $Id: statistics.c 5093 2006-07-10 13:36:47Z twisti $
 
 */
 
 
+#include "config.h"
+
+#include <string.h> 
 #include <sys/time.h>
 #include <sys/resource.h>
 
+#include "vm/types.h"
+
 #include "toolbox/logging.h"
 #include "vm/global.h"
 #include "vm/options.h"
 #include "vm/statistics.h"
-#include <string.h> 
 
 
-/* global variables */
+/* global variables ***********************************************************/
 
 static s8 loadingtime = 0;              /* accumulated loading time           */
 static s8 loadingstarttime = 0;
@@ -53,15 +59,28 @@ static s8 compilingstarttime = 0;
 static s8 compilingstoptime = 0;
 static s4 compilingtime_recursion = 0;
 
+s4 codememusage = 0;
+s4 maxcodememusage = 0;
+
 s4 memoryusage = 0;
 s4 maxmemusage = 0;
+
 s4 maxdumpsize = 0;
 
 s4 globalallocateddumpsize = 0;
 s4 globaluseddumpsize = 0;
 
-int count_class_infos = 0;              /* variables for measurements         */
+
+/* variables for measurements *************************************************/
+
+s4 size_classinfo  = 0;
+s4 size_fieldinfo  = 0;
+s4 size_methodinfo = 0;
+s4 size_codeinfo   = 0;
+
 int count_const_pool_len = 0;
+int count_classref_len = 0;
+int count_parsed_desc_len = 0;
 int count_vftbl_len = 0;
 int count_all_methods = 0;
 int count_methods_marked_used = 0;  /* RTA */
@@ -86,6 +105,10 @@ int count_interface_size = 0;
 int count_argument_mem_ss = 0;
 int count_argument_reg_ss = 0;
 int count_method_in_register = 0;
+int count_mov_reg_reg = 0;
+int count_mov_mem_reg = 0;
+int count_mov_reg_mem = 0;
+int count_mov_mem_mem = 0;
 
 int count_jit_calls = 0;
 int count_methods = 0;
@@ -126,23 +149,10 @@ int count_cstub_len = 0;
 int count_nstub_len = 0;
 int count_max_new_stack = 0;
 int count_upper_bound_new_stack = 0;
-                                /* in_  inline statistics */
-int count_in = 0;
-int count_in_uniqVirt = 0;
-int count_in_uniqIntf = 0;
-int count_in_rejected = 0;
-int count_in_rejected_mult = 0;
-int count_in_outsiders = 0;
-int count_in_uniqueVirt_not_inlined = 0;
-int count_in_uniqueInterface_not_inlined = 0;
-int count_in_maxDepth = 0;
-int count_in_maxMethods = 0;
-
-u2 count_in_not   [512];
-/***
-int count_no_in[12] = {0,0,0,0, 0,0,0,0, 0,0,0,0};
-***/
 
+u8 count_native_function_calls=0;
+u8 count_jni_callXmethod_calls=0;
+u8 count_jni_calls=0;
 
 
 static int count_block_stack_init[11] = {
@@ -192,13 +202,52 @@ s4 count_schedule_max_leaders = 0;
 s4 count_schedule_critical_path = 0;
 
 
+/* nativeinvokation ***********************************************************
+
+   increments the native invokation count by one
+       
+*******************************************************************************/
+
+void nativeinvokation(void)
+{
+       /* XXX do locking here */
+       count_native_function_calls++;
+}
+
+
+/* jnicallXmethodinvokation ***************************************************
+
+   increments the jni CallXMethod invokation count by one
+       
+*******************************************************************************/
+
+void jnicallXmethodnvokation(void)
+{
+       /* XXX do locking here */
+       count_jni_callXmethod_calls++;
+}
+
+
+/* jniinvokation *************************************************************
+
+   increments the jni overall  invokation count by one
+       
+*******************************************************************************/
+
+void jniinvokation(void)
+{
+       /* XXX do locking here */
+       count_jni_calls++;
+}
+
+
 /* getcputime *********************************** ******************************
 
    Returns the used CPU time in microseconds
        
 *******************************************************************************/
 
-s8 getcputime()
+s8 getcputime(void)
 {
        struct rusage ru;
        int sec, usec;
@@ -217,7 +266,7 @@ s8 getcputime()
 
 *******************************************************************************/
 
-void loadingtime_start()
+void loadingtime_start(void)
 {
        loadingtime_recursion++;
 
@@ -232,7 +281,7 @@ void loadingtime_start()
 
 *******************************************************************************/
 
-void loadingtime_stop()
+void loadingtime_stop(void)
 {
        if (loadingtime_recursion == 1) {
                loadingstoptime = getcputime();
@@ -249,7 +298,7 @@ void loadingtime_stop()
 
 *******************************************************************************/
 
-void compilingtime_start()
+void compilingtime_start(void)
 {
        compilingtime_recursion++;
 
@@ -264,7 +313,7 @@ void compilingtime_start()
 
 *******************************************************************************/
 
-void compilingtime_stop()
+void compilingtime_stop(void)
 {
        if (compilingtime_recursion == 1) {
                compilingstoptime = getcputime();
@@ -281,43 +330,25 @@ void compilingtime_stop()
 
 *******************************************************************************/
 
-void print_times()
+void print_times(void)
 {
-       s8 totaltime = getcputime();
-       s8 runtime = totaltime - loadingtime - compilingtime;
-       char logtext[MAXLOGTEXT];
+       s8 totaltime;
+       s8 runtime;
 
-#if defined(__I386__) || defined(__POWERPC__)
-       sprintf(logtext, "Time for loading classes: %lld secs, %lld millis",
-#else
-       sprintf(logtext, "Time for loading classes: %ld secs, %ld millis",
-#endif
-                       loadingtime / 1000000, (loadingtime % 1000000) / 1000);
-       log_text(logtext);
-
-#if defined(__I386__) || defined(__POWERPC__) 
-       sprintf(logtext, "Time for compiling code:  %lld secs, %lld millis",
-#else
-       sprintf(logtext, "Time for compiling code:  %ld secs, %ld millis",
-#endif
-                       compilingtime / 1000000, (compilingtime % 1000000) / 1000);
-       log_text(logtext);
-
-#if defined(__I386__) || defined(__POWERPC__) 
-       sprintf(logtext, "Time for running program: %lld secs, %lld millis",
-#else
-       sprintf(logtext, "Time for running program: %ld secs, %ld millis",
-#endif
-                       runtime / 1000000, (runtime % 1000000) / 1000);
-       log_text(logtext);
+       totaltime = getcputime();
+       runtime = totaltime - loadingtime - compilingtime;
 
-#if defined(__I386__) || defined(__POWERPC__) 
-       sprintf(logtext, "Total time: %lld secs, %lld millis",
+#if SIZEOF_VOID_P == 8
+       dolog("Time for loading classes: %6ld ms", loadingtime / 1000);
+       dolog("Time for compiling code:  %6ld ms", compilingtime / 1000);
+       dolog("Time for running program: %6ld ms", runtime / 1000);
+       dolog("Total time:               %6ld ms", totaltime / 1000);
 #else
-       sprintf(logtext, "Total time: %ld secs, %ld millis",
+       dolog("Time for loading classes: %6lld ms", loadingtime / 1000);
+       dolog("Time for compiling code:  %6lld ms", compilingtime / 1000);
+       dolog("Time for running program: %6lld ms", runtime / 1000);
+       dolog("Total time:               %6lld ms", totaltime / 1000);
 #endif
-                       totaltime / 1000000, (totaltime % 1000000) / 1000);
-       log_text(logtext);
 }
 
 
@@ -327,279 +358,231 @@ void print_times()
 
 *******************************************************************************/
 
-void print_stats()
+void print_stats(void)
 {
-       char logtext[MAXLOGTEXT];
-
-       sprintf(logtext, "Number of JitCompiler Calls: %d", count_jit_calls);
-       log_text(logtext);
-       sprintf(logtext, "Number of compiled Methods: %d", count_methods);
-       log_text(logtext);
-        if (opt_rt) {
-         sprintf(logtext, "Number of Methods marked Used: %d", count_methods_marked_used);
-         log_text(logtext);
-         }
-       sprintf(logtext, "Number of max basic blocks per method: %d", count_max_basic_blocks);
-       log_text(logtext);
-       sprintf(logtext, "Number of compiled basic blocks: %d", count_basic_blocks);
-       log_text(logtext);
-       sprintf(logtext, "Number of max JavaVM-Instructions per method: %d", count_max_javainstr);
-       log_text(logtext);
-       sprintf(logtext, "Number of compiled JavaVM-Instructions: %d", count_javainstr);
-       log_text(logtext);
-       sprintf(logtext, "Size of compiled JavaVM-Instructions:   %d(%d)", count_javacodesize,
-                       count_javacodesize - count_methods * 18);
-       log_text(logtext);
-       sprintf(logtext, "Size of compiled Exception Tables:      %d", count_javaexcsize);
-       log_text(logtext);
-       sprintf(logtext, "Number of Machine-Instructions: %d", count_code_len >> 2);
-       log_text(logtext);
-       sprintf(logtext, "Number of Spills (write to memory): %d", count_spills);
-       log_text(logtext);
-       sprintf(logtext, "Number of Spills (read from memory): %d", count_spills_read);
-       log_text(logtext);
-       sprintf(logtext, "Number of Activ    Pseudocommands: %6d", count_pcmd_activ);
-       log_text(logtext);
-       sprintf(logtext, "Number of Drop     Pseudocommands: %6d", count_pcmd_drop);
-       log_text(logtext);
-       sprintf(logtext, "Number of Const    Pseudocommands: %6d (zero:%5d)", count_pcmd_load, count_pcmd_zero);
-       log_text(logtext);
-       sprintf(logtext, "Number of ConstAlu Pseudocommands: %6d (cmp: %5d, store:%5d)", count_pcmd_const_alu, count_pcmd_const_bra, count_pcmd_const_store);
-       log_text(logtext);
-       sprintf(logtext, "Number of Move     Pseudocommands: %6d", count_pcmd_move);
-       log_text(logtext);
-       sprintf(logtext, "Number of Load     Pseudocommands: %6d", count_load_instruction);
-       log_text(logtext);
-       sprintf(logtext, "Number of Store    Pseudocommands: %6d (combined: %5d)", count_pcmd_store, count_pcmd_store - count_pcmd_store_comb);
-       log_text(logtext);
-       sprintf(logtext, "Number of OP       Pseudocommands: %6d", count_pcmd_op);
-       log_text(logtext);
-       sprintf(logtext, "Number of DUP      Pseudocommands: %6d", count_dup_instruction);
-       log_text(logtext);
-       sprintf(logtext, "Number of Mem      Pseudocommands: %6d", count_pcmd_mem);
-       log_text(logtext);
-       sprintf(logtext, "Number of Method   Pseudocommands: %6d", count_pcmd_met);
-       log_text(logtext);
-       sprintf(logtext, "Number of Branch   Pseudocommands: %6d (rets:%5d, Xrets: %5d)",
-                       count_pcmd_bra, count_pcmd_return, count_pcmd_returnx);
-       log_text(logtext);
-       sprintf(logtext, "Number of Table    Pseudocommands: %6d", count_pcmd_table);
-       log_text(logtext);
-       sprintf(logtext, "Number of Useful   Pseudocommands: %6d", count_pcmd_table +
-                       count_pcmd_bra + count_pcmd_load + count_pcmd_mem + count_pcmd_op);
-       log_text(logtext);
-       sprintf(logtext, "Number of Null Pointer Checks:     %6d", count_check_null);
-       log_text(logtext);
-       sprintf(logtext, "Number of Array Bound Checks:      %6d", count_check_bound);
-       log_text(logtext);
-       sprintf(logtext, "Number of Try-Blocks: %d", count_tryblocks);
-       log_text(logtext);
-       sprintf(logtext, "Maximal count of stack elements:   %d", count_max_new_stack);
-       log_text(logtext);
-       sprintf(logtext, "Upper bound of max stack elements: %d", count_upper_bound_new_stack);
-       log_text(logtext);
-       sprintf(logtext, "Distribution of stack sizes at block boundary");
-       log_text(logtext);
-       sprintf(logtext, "     0     1     2     3     4     5     6     7     8     9  >=10");
-       log_text(logtext);
-       sprintf(logtext, "%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d", count_block_stack[0],
-                       count_block_stack[1], count_block_stack[2], count_block_stack[3], count_block_stack[4],
-                       count_block_stack[5], count_block_stack[6], count_block_stack[7], count_block_stack[8],
-                       count_block_stack[9], count_block_stack[10]);
-       log_text(logtext);
-       sprintf(logtext, "Distribution of store stack depth");
-       log_text(logtext);
-       sprintf(logtext, "     0     1     2     3     4     5     6     7     8     9  >=10");
-       log_text(logtext);
-       sprintf(logtext, "%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d", count_store_depth[0],
-                       count_store_depth[1], count_store_depth[2], count_store_depth[3], count_store_depth[4],
-                       count_store_depth[5], count_store_depth[6], count_store_depth[7], count_store_depth[8],
-                       count_store_depth[9], count_store_depth[10]);
-       log_text(logtext);
-       sprintf(logtext, "Distribution of store creator chains first part");
-       log_text(logtext);
-       sprintf(logtext, "     0     1     2     3     4     5     6     7     8     9");
-       log_text(logtext);
-       sprintf(logtext, "%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d", count_store_length[0],
-                       count_store_length[1], count_store_length[2], count_store_length[3], count_store_length[4],
-                       count_store_length[5], count_store_length[6], count_store_length[7], count_store_length[8],
-                       count_store_length[9]);
-       log_text(logtext);
-       sprintf(logtext, "Distribution of store creator chains second part");
-       log_text(logtext);
-       sprintf(logtext, "    10    11    12    13    14    15    16    17    18    19  >=20");
-       log_text(logtext);
-       sprintf(logtext, "%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d", count_store_length[10],
-                       count_store_length[11], count_store_length[12], count_store_length[13], count_store_length[14],
-                       count_store_length[15], count_store_length[16], count_store_length[17], count_store_length[18],
-                       count_store_length[19], count_store_length[20]);
-       log_text(logtext);
-       sprintf(logtext, "Distribution of analysis iterations");
-       log_text(logtext);
-       sprintf(logtext, "     1     2     3     4   >=5");
-       log_text(logtext);
-       sprintf(logtext, "%6d%6d%6d%6d%6d", count_analyse_iterations[0], count_analyse_iterations[1],
-                       count_analyse_iterations[2], count_analyse_iterations[3], count_analyse_iterations[4]);
-       log_text(logtext);
-       sprintf(logtext, "Distribution of basic blocks per method");
-       log_text(logtext);
-       sprintf(logtext, "   <=5  <=10  <=15  <=20  <=30  <=40  <=50  <=75   >75");
-       log_text(logtext);
-       sprintf(logtext, "%6d%6d%6d%6d%6d%6d%6d%6d%6d", count_method_bb_distribution[0],
-                       count_method_bb_distribution[1], count_method_bb_distribution[2], count_method_bb_distribution[3],
-                       count_method_bb_distribution[4], count_method_bb_distribution[5], count_method_bb_distribution[6],
-                       count_method_bb_distribution[7], count_method_bb_distribution[8]);
-       log_text(logtext);
-       sprintf(logtext, "Distribution of basic block sizes");
-       log_text(logtext);
-       sprintf(logtext, "     0     1     2     3     4    5    6    7    8    9  <13  <15  <17  <19  <21  <26  <31  >30");
-       log_text(logtext);
-       sprintf(logtext, "%6d%6d%6d%6d%6d%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d",
-                       count_block_size_distribution[0], count_block_size_distribution[1], count_block_size_distribution[2],
-                       count_block_size_distribution[3], count_block_size_distribution[4], count_block_size_distribution[5],
-                       count_block_size_distribution[6], count_block_size_distribution[7], count_block_size_distribution[8],
-                       count_block_size_distribution[9], count_block_size_distribution[10], count_block_size_distribution[11],
-                       count_block_size_distribution[12], count_block_size_distribution[13], count_block_size_distribution[14],
-                       count_block_size_distribution[15], count_block_size_distribution[16], count_block_size_distribution[17]);
-       log_text(logtext);
-       sprintf(logtext, "Size of Code Area (Kb):  %10.3f", (float) count_code_len / 1024);
-       log_text(logtext);
-       sprintf(logtext, "Size of data Area (Kb):  %10.3f", (float) count_data_len / 1024);
-       log_text(logtext);
-       sprintf(logtext, "Size of Class Infos (Kb):%10.3f", (float) (count_class_infos) / 1024);
-       log_text(logtext);
-       sprintf(logtext, "Size of Const Pool (Kb): %10.3f", (float) (count_const_pool_len + count_utf_len) / 1024);
-       log_text(logtext);
-       sprintf(logtext, "Size of Vftbl (Kb):      %10.3f", (float) count_vftbl_len / 1024);
-       log_text(logtext);
-       sprintf(logtext, "Size of comp stub (Kb):  %10.3f", (float) count_cstub_len / 1024);
-       log_text(logtext);
-       sprintf(logtext, "Size of native stub (Kb):%10.3f", (float) count_nstub_len / 1024);
-       log_text(logtext);
-       sprintf(logtext, "Size of Utf (Kb):        %10.3f", (float) count_utf_len / 1024);
-       log_text(logtext);
-       sprintf(logtext, "Size of VMCode (Kb):     %10.3f(%d)", (float) count_vmcode_len / 1024,
-                       count_vmcode_len - 18 * count_all_methods);
-       log_text(logtext);
-       sprintf(logtext, "Size of ExTable (Kb):    %10.3f", (float) count_extable_len / 1024);
-       log_text(logtext);
-       sprintf(logtext, "Number of class loads:   %d", count_class_loads);
-       log_text(logtext);
-       sprintf(logtext, "Number of class inits:   %d", count_class_inits);
-       log_text(logtext);
-       sprintf(logtext, "Number of loaded Methods: %d\n", count_all_methods);
-       log_text(logtext);
-
-       sprintf(logtext, "Calls of utf_new: %22d", count_utf_new);
-       log_text(logtext);
-       sprintf(logtext, "Calls of utf_new (element found): %6d\n", count_utf_new_found);
-       log_text(logtext);
+       s4    i;
+       float f;
+       s4    sum;
+
+
+       dolog("Number of JIT compiler calls: %6d", count_jit_calls);
+       dolog("Number of compiled methods:   %6d", count_methods);
+
+       dolog("Number of compiled basic blocks:               %6d",
+                 count_basic_blocks);
+       dolog("Number of max. basic blocks per method:        %6d",
+                 count_max_basic_blocks);
+
+       dolog("Number of compiled JavaVM instructions:        %6d",
+                 count_javainstr);
+       dolog("Number of max. JavaVM instructions per method: %6d",
+                 count_max_javainstr);
+       dolog("Size of compiled JavaVM instructions:          %6d(%d)",
+                 count_javacodesize, count_javacodesize - count_methods * 18);
+
+       dolog("Size of compiled Exception Tables:      %d", count_javaexcsize);
+       dolog("Number of Machine-Instructions: %d", count_code_len >> 2);
+       dolog("Number of Spills (write to memory): %d", count_spills);
+       dolog("Number of Spills (read from memory): %d", count_spills_read);
+       dolog("Number of Activ    Pseudocommands: %6d", count_pcmd_activ);
+       dolog("Number of Drop     Pseudocommands: %6d", count_pcmd_drop);
+       dolog("Number of Const    Pseudocommands: %6d (zero:%5d)",
+                 count_pcmd_load, count_pcmd_zero);
+       dolog("Number of ConstAlu Pseudocommands: %6d (cmp: %5d, store:%5d)",
+                 count_pcmd_const_alu, count_pcmd_const_bra, count_pcmd_const_store);
+       dolog("Number of Move     Pseudocommands: %6d", count_pcmd_move);
+       dolog("Number of Load     Pseudocommands: %6d", count_load_instruction);
+       dolog("Number of Store    Pseudocommands: %6d (combined: %5d)",
+                 count_pcmd_store, count_pcmd_store - count_pcmd_store_comb);
+       dolog("Number of OP       Pseudocommands: %6d", count_pcmd_op);
+       dolog("Number of DUP      Pseudocommands: %6d", count_dup_instruction);
+       dolog("Number of Mem      Pseudocommands: %6d", count_pcmd_mem);
+       dolog("Number of Method   Pseudocommands: %6d", count_pcmd_met);
+       dolog("Number of Branch   Pseudocommands: %6d (rets:%5d, Xrets: %5d)",
+                 count_pcmd_bra, count_pcmd_return, count_pcmd_returnx);
+       dolog("Number of Table    Pseudocommands: %6d", count_pcmd_table);
+       dolog("Number of Useful   Pseudocommands: %6d", count_pcmd_table +
+                 count_pcmd_bra + count_pcmd_load + count_pcmd_mem + count_pcmd_op);
+       dolog("Number of Null Pointer Checks:     %6d", count_check_null);
+       dolog("Number of Array Bound Checks:      %6d", count_check_bound);
+       dolog("Number of Try-Blocks: %d", count_tryblocks);
+       dolog("Maximal count of stack elements:   %d", count_max_new_stack);
+       dolog("Upper bound of max stack elements: %d", count_upper_bound_new_stack);
+       dolog("Distribution of stack sizes at block boundary");
+       dolog("     0     1     2     3     4     5     6     7     8     9  >=10");
+       dolog("%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d",
+                 count_block_stack[0], count_block_stack[1], count_block_stack[2],
+                 count_block_stack[3], count_block_stack[4], count_block_stack[5],
+                 count_block_stack[6], count_block_stack[7], count_block_stack[8],
+                 count_block_stack[9], count_block_stack[10]);
+       dolog("Distribution of store stack depth");
+       dolog("     0     1     2     3     4     5     6     7     8     9  >=10");
+       dolog("%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d",
+                 count_store_depth[0], count_store_depth[1], count_store_depth[2],
+                 count_store_depth[3], count_store_depth[4], count_store_depth[5],
+                 count_store_depth[6], count_store_depth[7], count_store_depth[8],
+                 count_store_depth[9], count_store_depth[10]);
+       dolog("Distribution of store creator chains first part");
+       dolog("     0     1     2     3     4     5     6     7     8     9");
+       dolog("%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d",
+                 count_store_length[0], count_store_length[1], count_store_length[2],
+                 count_store_length[3], count_store_length[4], count_store_length[5],
+                 count_store_length[6], count_store_length[7], count_store_length[8],
+                 count_store_length[9]);
+       dolog("Distribution of store creator chains second part");
+       dolog("    10    11    12    13    14    15    16    17    18    19  >=20");
+       dolog("%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d",
+                 count_store_length[10], count_store_length[11],
+                 count_store_length[12], count_store_length[13],
+                 count_store_length[14], count_store_length[15],
+                 count_store_length[16], count_store_length[17],
+                 count_store_length[18], count_store_length[19],
+                 count_store_length[20]);
+       dolog("Distribution of analysis iterations");
+       dolog("     1     2     3     4   >=5");
+       dolog("%6d%6d%6d%6d%6d",
+                 count_analyse_iterations[0], count_analyse_iterations[1],
+                 count_analyse_iterations[2], count_analyse_iterations[3],
+                 count_analyse_iterations[4]);
+
+
+       /* Distribution of basic blocks per method ********************************/
+
+       log_println("Distribution of basic blocks per method:");
+       log_println("   <=5  <=10  <=15  <=20  <=30  <=40  <=50  <=75   >75");
+
+       log_start();
+       for (i = 0; i <= 8; i++)
+               log_print("%6d", count_method_bb_distribution[i]);
+       log_finish();
+
+       /* print ratio */
+
+       f = (float) count_methods;
+
+       log_start();
+       for (i = 0; i <= 8; i++)
+               log_print("%6.2f", (float) count_method_bb_distribution[i] / f);
+       log_finish();
+
+       /* print cumulated ratio */
+
+       log_start();
+       for (i = 0, sum = 0; i <= 8; i++) {
+               sum += count_method_bb_distribution[i];
+               log_print("%6.2f", (float) sum / f);
+       }
+       log_finish();
+
+
+       /* Distribution of basic block sizes **************************************/
+
+       log_println("Distribution of basic block sizes:");
+       log_println("     0     1     2     3     4     5     6     7     8     9   <13   <15   <17   <19   <21   <26   <31   >30");
+
+       /* print block sizes */
+
+       log_start();
+       for (i = 0; i <= 17; i++)
+               log_print("%6d", count_block_size_distribution[i]);
+       log_finish();
+
+       /* print ratio */
+
+       f = (float) count_basic_blocks;
+
+       log_start();
+       for (i = 0; i <= 17; i++)
+               log_print("%6.2f", (float) count_block_size_distribution[i] / f);
+       log_finish();
+
+       /* print cumulated ratio */
+
+       log_start();
+       for (i = 0, sum = 0; i <= 17; i++) {
+               sum += count_block_size_distribution[i];
+               log_print("%6.2f", (float) sum / f);
+       }
+       log_finish();
+
+       log_println("Size of Code Area:          %10.3f kB", (float) count_code_len / 1024);
+       log_println("Size of Data Area:          %10.3f kB", (float) count_data_len / 1024);
+
+       log_println("Size of classinfo  (%3d B): %10.3f kB", sizeof(classinfo), (float) size_classinfo / 1024);
+       log_println("Size of fieldinfo  (%3d B): %10.3f kB", sizeof(fieldinfo), (float) size_fieldinfo / 1024);
+       log_println("Size of methodinfo (%3d B): %10.3f kB", sizeof(methodinfo), (float) size_methodinfo / 1024);
+       log_println("Size of codeinfo   (%3d B): %10.3f kB", sizeof(codeinfo), (float) size_codeinfo / 1024);
+
+       log_println("Size of Const Pool:         %10.3f kB", (float) (count_const_pool_len + count_utf_len) / 1024);
+       log_println("Size of Class refs:         %10.3f kB", (float) count_classref_len / 1024);
+       log_println("Size of descriptors:        %10.3f kB", (float) count_parsed_desc_len / 1024);
+       log_println("Size of vftbl:              %10.3f kB", (float) count_vftbl_len / 1024);
+       log_println("Size of compiler stubs:     %10.3f kB", (float) count_cstub_len / 1024);
+       log_println("Size of native stubs:       %10.3f kB", (float) count_nstub_len / 1024);
+       log_println("Size of utf:                %10.3f kB", (float) count_utf_len / 1024);
+       log_println("Size of VMCode:             %10.3f kB", (float) count_vmcode_len / 1024);
+       log_println("Size of exception tables:   %10.3f kB\n", (float) count_extable_len / 1024);
+
+       dolog("Number of class loads:    %6d", count_class_loads);
+       dolog("Number of class inits:    %6d", count_class_inits);
+       dolog("Number of loaded Methods: %6d\n", count_all_methods);
+
+       dolog("Calls of utf_new:                 %6d", count_utf_new);
+       dolog("Calls of utf_new (element found): %6d\n", count_utf_new_found);
 
 
        /* LSRA statistics ********************************************************/
 
-       sprintf(logtext, "Methods allocated by LSRA:         %6d", count_methods_allocated_by_lsra);
-       log_text(logtext);
-       sprintf(logtext, "Conflicts between local Variables: %6d", count_locals_conflicts);
-       log_text(logtext);
-       sprintf(logtext, "Local Variables held in Memory:    %6d", count_locals_spilled);
-       log_text(logtext);
-       sprintf(logtext, "Local Variables held in Registers: %6d", count_locals_register);
-       log_text(logtext);
-       sprintf(logtext, "Stackslots held in Memory:         %6d", count_ss_spilled);
-       log_text(logtext);
-       sprintf(logtext, "Stackslots held in Registers:      %6d",count_ss_register );
-       log_text(logtext);
-       sprintf(logtext, "Memory moves at BB Boundaries:     %6d",count_mem_move_bb );
-       log_text(logtext);
-       sprintf(logtext, "Number of interface slots:         %6d\n",count_interface_size );
-       log_text(logtext);
-       sprintf(logtext, "Number of Argument stack slots in register:  %6d",count_argument_reg_ss );
-       log_text(logtext);
-       sprintf(logtext, "Number of Argument stack slots in memory:    %6d\n",count_argument_mem_ss );
-       log_text(logtext);
-       sprintf(logtext, "Number of Methods kept in registers:         %6d\n",count_method_in_register );
-       log_text(logtext);
-               
-       /****if (useinlining)  ***/
-        {
-               u2 ii;
-               char * in_not_reasons[IN_MAX] = {
-                                               "unqVirt    | ",
-                                               "unqIntf    | ",
-                                               "outsider   | ",
-                                               "maxDepth   | ",
-                                               "maxcode    | ",
-                                               "maxlen     | ",
-                                               "exception  | ",
-                                               "notUnqVirt | ",
-                                               "notUnqIntf |"
-                                               };
-
-               sprintf(logtext, "Number of Methods Inlined :                              \t%6d",count_in );
-               log_text(logtext);
-               if (inlinevirtuals) {
-                 sprintf(logtext, "Number of Unique Virtual Methods inlined:                \t%6d",count_in_uniqVirt);
-                 log_text(logtext);
-                 sprintf(logtext, "Number of Unique Implemented Interface Methods inlined:    %6d",count_in_uniqIntf);
-                 log_text(logtext);
-                 }
-               sprintf(logtext, "Number of Methods Inlines (total) rejected:              \t%6d",count_in_rejected);
-               log_text(logtext);
-               sprintf(logtext, "Number of Methods Inlined rejected for multiple reasons: \t%6d",count_in_rejected_mult);
-               log_text(logtext);
-               sprintf(logtext, "Number of Methods where Inline max depth hit:            \t%6d",count_in_maxDepth);
-               log_text(logtext);
-               sprintf(logtext, "Number of Methods Inlined rejected for max methods       \t%6d\n",count_in_maxMethods);
-               log_text(logtext);
-               sprintf(logtext, "Number of Methods calls fom Outsider Class not inlined:  \t%6d",count_in_outsiders);
-               log_text(logtext);
-
-               sprintf(logtext, "Number of Unique Virtual Methods not inlined:            \t%6d",count_in_uniqueVirt_not_inlined);
-               log_text(logtext);
-               sprintf(logtext, "Number of Unique Implemented Interface Methods not inlined:%6d",count_in_uniqueInterface_not_inlined);
-               log_text(logtext);
-#define INLINEDETAILS
-#ifdef  INLINEDETAILS
-               sprintf(logtext, "\nDetails about Not Inlined Reasons :");
-               log_text(logtext);
-               for (ii=0;ii<512;ii++) {
-                       if (count_in_not[ii]>0) {
-                               char logtext2[MAXLOGTEXT]="\t";
-
-                               if (inlinevirtuals) {
-                                 if (ii & IN_UNIQUEVIRT) strcat(logtext2, in_not_reasons[N_UNIQUEVIRT]); 
-                                 if (ii & IN_UNIQUE_INTERFACE) strcat(logtext2,  in_not_reasons[N_UNIQUE_INTERFACE]);
-                                 if (ii & IN_NOT_UNIQUE_VIRT) strcat(logtext2,  in_not_reasons[N_NOT_UNIQUE_VIRT]);
-                                 if (ii & IN_NOT_UNIQUE_INTERFACE) strcat(logtext2,  in_not_reasons[N_NOT_UNIQUE_INTERFACE]);
-                                 }
-                               if (ii & IN_OUTSIDERS) strcat(logtext2,  in_not_reasons[N_OUTSIDERS]);
-                               if (ii & IN_MAXDEPTH) strcat(logtext2,  in_not_reasons[N_MAXDEPTH]);
-                               if (ii & IN_MAXCODE) strcat(logtext2,  in_not_reasons[N_MAXCODE]);
-                               if (ii & IN_JCODELENGTH) strcat(logtext2,  in_not_reasons[N_JCODELENGTH]);
-                               if (ii & IN_EXCEPTION) strcat(logtext2,  in_not_reasons[N_EXCEPTION]);
-                               sprintf(logtext, "  [%X]=%6d    %s",ii, count_in_not[ii], logtext2 );
-                               log_text(logtext);
-                               }
-                       }       
+       dolog("Moves reg -> reg:     %6d", count_mov_reg_reg);
+       dolog("Moves mem -> reg:     %6d", count_mov_mem_reg);
+       dolog("Moves reg -> mem:     %6d", count_mov_reg_mem);
+       dolog("Moves mem -> mem:     %6d", count_mov_mem_mem);
+
+       dolog("Methods allocated by LSRA:         %6d",
+                 count_methods_allocated_by_lsra);
+       dolog("Conflicts between local Variables: %6d", count_locals_conflicts);
+       dolog("Local Variables held in Memory:    %6d", count_locals_spilled);
+       dolog("Local Variables held in Registers: %6d", count_locals_register);
+       dolog("Stackslots held in Memory:         %6d", count_ss_spilled);
+       dolog("Stackslots held in Registers:      %6d", count_ss_register);
+       dolog("Memory moves at BB Boundaries:     %6d", count_mem_move_bb);
+       dolog("Number of interface slots:         %6d\n", count_interface_size);
+       dolog("Number of Argument stack slots in register:  %6d",
+                 count_argument_reg_ss);
+       dolog("Number of Argument stack slots in memory:    %6d\n",
+                 count_argument_mem_ss);
+       dolog("Number of Methods kept in registers:         %6d\n",
+                 count_method_in_register);
+
+
+       /* instruction scheduler statistics ***************************************/
+
+#if defined(USE_SCHEDULER)
+       dolog("Instruction scheduler statistics:");
+       dolog("Number of basic blocks:       %7d", count_schedule_basic_blocks);
+       dolog("Number of nodes:              %7d", count_schedule_nodes);
+       dolog("Number of leaders nodes:      %7d", count_schedule_leaders);
+       dolog("Number of max. leaders nodes: %7d", count_schedule_max_leaders);
+       dolog("Length of critical path:      %7d\n", count_schedule_critical_path);
+#endif
+
+
+       /* call statistics ********************************************************/
+
+       dolog("Function call statistics:");
+       dolog("Number of native function invokations:           %ld",
+                 count_native_function_calls);
+       dolog("Number of jni->CallXMethod function invokations: %ld",
+                 count_jni_callXmethod_calls);
+       dolog("Overall number of jni invokations:               %ld",
+                 count_jni_calls);
+
+
+       /* now print other statistics ********************************************/
+
+#if defined(ENABLE_INTRP)
+       print_dynamic_super_statistics();
 #endif
-               }
-
-
-        /* instruction scheduler statistics **************************************/
-
-        sprintf(logtext, "Instruction scheduler statistics:");
-        log_text(logtext);
-        sprintf(logtext, "Number of basic blocks:       %7d", count_schedule_basic_blocks);
-        log_text(logtext);
-        sprintf(logtext, "Number of nodes:              %7d", count_schedule_nodes);
-        log_text(logtext);
-        sprintf(logtext, "Number of leaders nodes:      %7d", count_schedule_leaders);
-        log_text(logtext);
-        sprintf(logtext, "Number of max. leaders nodes: %7d", count_schedule_max_leaders);
-        log_text(logtext);
-        sprintf(logtext, "Length of critical path:      %7d\n", count_schedule_critical_path);
-        log_text(logtext);
 }
 
 
@@ -612,15 +595,19 @@ void print_stats()
 void mem_usagelog(bool givewarnings)
 {
        if ((memoryusage != 0) && givewarnings) {
-               dolog("Allocated memory not returned: %d", (s4) memoryusage);
+               dolog("Allocated memory not returned: %9d", (s4) memoryusage);
        }
 
        if ((globalallocateddumpsize != 0) && givewarnings) {
-               dolog("Dump memory not returned: %d", (s4) globalallocateddumpsize);
+               dolog("Dump memory not returned:      %9d",
+                         (s4) globalallocateddumpsize);
        }
 
-       dolog("Random/Dump - max. memory usage: %dkB/%dkB", 
-                 (s4) ((maxmemusage + 1023) / 1024),
+       dolog("Code - max. memory usage:      %9d kB",
+                 (s4) ((maxcodememusage + 1023) / 1024));
+       dolog("Random - max. memory usage:    %9d kB",
+                 (s4) ((maxmemusage + 1023) / 1024));
+       dolog("Dump - max. memory usage:      %9d kB",
                  (s4) ((maxdumpsize + 1023) / 1024));
 }