hotspot/src/share/vm/oops/generateOopMap.cpp
changeset 13282 9872915dd78d
parent 10278 e656a9aae10d
child 13391 30245956af37
equal deleted inserted replaced
13102:7342fd50f8d7 13282:9872915dd78d
     1 /*
     1 /*
     2  * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
   398   initialize_bb();
   398   initialize_bb();
   399 
   399 
   400   bool fellThrough = false;  // False to get first BB marked.
   400   bool fellThrough = false;  // False to get first BB marked.
   401 
   401 
   402   // First mark all exception handlers as start of a basic-block
   402   // First mark all exception handlers as start of a basic-block
   403   typeArrayOop excps = method()->exception_table();
   403   ExceptionTable excps(method());
   404   for(int i = 0; i < excps->length(); i += 4) {
   404   for(int i = 0; i < excps.length(); i ++) {
   405     int handler_pc_idx = i+2;
   405     bb_mark_fct(this, excps.handler_pc(i), NULL);
   406     bb_mark_fct(this, excps->int_at(handler_pc_idx), NULL);
       
   407   }
   406   }
   408 
   407 
   409   // Then iterate through the code
   408   // Then iterate through the code
   410   BytecodeStream bcs(_method);
   409   BytecodeStream bcs(_method);
   411   Bytecodes::Code bytecode;
   410   Bytecodes::Code bytecode;
   448 void GenerateOopMap::mark_reachable_code() {
   447 void GenerateOopMap::mark_reachable_code() {
   449   int change = 1; // int to get function pointers to work
   448   int change = 1; // int to get function pointers to work
   450 
   449 
   451   // Mark entry basic block as alive and all exception handlers
   450   // Mark entry basic block as alive and all exception handlers
   452   _basic_blocks[0].mark_as_alive();
   451   _basic_blocks[0].mark_as_alive();
   453   typeArrayOop excps = method()->exception_table();
   452   ExceptionTable excps(method());
   454   for(int i = 0; i < excps->length(); i += 4) {
   453   for(int i = 0; i < excps.length(); i++) {
   455     int handler_pc_idx = i+2;
   454     BasicBlock *bb = get_basic_block_at(excps.handler_pc(i));
   456     BasicBlock *bb = get_basic_block_at(excps->int_at(handler_pc_idx));
       
   457     // If block is not already alive (due to multiple exception handlers to same bb), then
   455     // If block is not already alive (due to multiple exception handlers to same bb), then
   458     // make it alive
   456     // make it alive
   459     if (bb->is_dead()) bb->mark_as_alive();
   457     if (bb->is_dead()) bb->mark_as_alive();
   460   }
   458   }
   461 
   459 
  1179       break;
  1177       break;
  1180   }
  1178   }
  1181 
  1179 
  1182   if (_has_exceptions) {
  1180   if (_has_exceptions) {
  1183     int bci = itr->bci();
  1181     int bci = itr->bci();
  1184     typeArrayOop exct  = method()->exception_table();
  1182     ExceptionTable exct(method());
  1185     for(int i = 0; i< exct->length(); i+=4) {
  1183     for(int i = 0; i< exct.length(); i++) {
  1186       int start_pc   = exct->int_at(i);
  1184       int start_pc   = exct.start_pc(i);
  1187       int end_pc     = exct->int_at(i+1);
  1185       int end_pc     = exct.end_pc(i);
  1188       int handler_pc = exct->int_at(i+2);
  1186       int handler_pc = exct.handler_pc(i);
  1189       int catch_type = exct->int_at(i+3);
  1187       int catch_type = exct.catch_type_index(i);
  1190 
  1188 
  1191       if (start_pc <= bci && bci < end_pc) {
  1189       if (start_pc <= bci && bci < end_pc) {
  1192         BasicBlock *excBB = get_basic_block_at(handler_pc);
  1190         BasicBlock *excBB = get_basic_block_at(handler_pc);
  1193         CellTypeState *excStk = excBB->stack();
  1191         CellTypeState *excStk = excBB->stack();
  1194         CellTypeState *cOpStck = stack();
  1192         CellTypeState *cOpStck = stack();
  2053   // Initialize values
  2051   // Initialize values
  2054   _got_error      = false;
  2052   _got_error      = false;
  2055   _conflict       = false;
  2053   _conflict       = false;
  2056   _max_locals     = method()->max_locals();
  2054   _max_locals     = method()->max_locals();
  2057   _max_stack      = method()->max_stack();
  2055   _max_stack      = method()->max_stack();
  2058   _has_exceptions = (method()->exception_table()->length() > 0);
  2056   _has_exceptions = (method()->has_exception_handler());
  2059   _nof_refval_conflicts = 0;
  2057   _nof_refval_conflicts = 0;
  2060   _init_vars      = new GrowableArray<intptr_t>(5);  // There are seldom more than 5 init_vars
  2058   _init_vars      = new GrowableArray<intptr_t>(5);  // There are seldom more than 5 init_vars
  2061   _report_result  = false;
  2059   _report_result  = false;
  2062   _report_result_for_send = false;
  2060   _report_result_for_send = false;
  2063   _new_var_map    = NULL;
  2061   _new_var_map    = NULL;
  2068   if (TraceNewOopMapGeneration) {
  2066   if (TraceNewOopMapGeneration) {
  2069     tty->print("Method name: %s\n", method()->name()->as_C_string());
  2067     tty->print("Method name: %s\n", method()->name()->as_C_string());
  2070     if (Verbose) {
  2068     if (Verbose) {
  2071       _method->print_codes();
  2069       _method->print_codes();
  2072       tty->print_cr("Exception table:");
  2070       tty->print_cr("Exception table:");
  2073       typeArrayOop excps = method()->exception_table();
  2071       ExceptionTable excps(method());
  2074       for(int i = 0; i < excps->length(); i += 4) {
  2072       for(int i = 0; i < excps.length(); i ++) {
  2075         tty->print_cr("[%d - %d] -> %d", excps->int_at(i + 0), excps->int_at(i + 1), excps->int_at(i + 2));
  2073         tty->print_cr("[%d - %d] -> %d",
       
  2074                       excps.start_pc(i), excps.end_pc(i), excps.handler_pc(i));
  2076       }
  2075       }
  2077     }
  2076     }
  2078   }
  2077   }
  2079 
  2078 
  2080   // if no code - do nothing
  2079   // if no code - do nothing