hotspot/src/share/vm/code/nmethod.cpp
changeset 347 df859fcca515
parent 203 2e348cc9121a
child 363 99d43e8a76ad
equal deleted inserted replaced
346:e13ccc474a28 347:df859fcca515
   705     assert(compiler->is_c2() ||
   705     assert(compiler->is_c2() ||
   706            _method->is_static() == (entry_point() == _verified_entry_point),
   706            _method->is_static() == (entry_point() == _verified_entry_point),
   707            " entry points must be same for static methods and vice versa");
   707            " entry points must be same for static methods and vice versa");
   708   }
   708   }
   709 
   709 
   710   bool printnmethods = PrintNMethods || CompilerOracle::has_option_string(_method, "PrintNMethods");
   710   bool printnmethods = PrintNMethods
       
   711     || CompilerOracle::should_print(_method)
       
   712     || CompilerOracle::has_option_string(_method, "PrintNMethods");
   711   if (printnmethods || PrintDebugInfo || PrintRelocations || PrintDependencies || PrintExceptionHandlers) {
   713   if (printnmethods || PrintDebugInfo || PrintRelocations || PrintDependencies || PrintExceptionHandlers) {
   712     print_nmethod(printnmethods);
   714     print_nmethod(printnmethods);
   713   }
   715   }
   714 
   716 
   715   // Note: Do not verify in here as the CodeCache_lock is
   717   // Note: Do not verify in here as the CodeCache_lock is
   796     }
   798     }
   797   }
   799   }
   798 }
   800 }
   799 
   801 
   800 
   802 
   801 #ifndef PRODUCT
       
   802 void nmethod::print_nmethod(bool printmethod) {
   803 void nmethod::print_nmethod(bool printmethod) {
   803   ttyLocker ttyl;  // keep the following output all in one block
   804   ttyLocker ttyl;  // keep the following output all in one block
   804   if (xtty != NULL) {
   805   if (xtty != NULL) {
   805     xtty->begin_head("print_nmethod");
   806     xtty->begin_head("print_nmethod");
   806     xtty->stamp();
   807     xtty->stamp();
   829   }
   830   }
   830   if (xtty != NULL) {
   831   if (xtty != NULL) {
   831     xtty->tail("print_nmethod");
   832     xtty->tail("print_nmethod");
   832   }
   833   }
   833 }
   834 }
   834 #endif
       
   835 
   835 
   836 
   836 
   837 void nmethod::set_version(int v) {
   837 void nmethod::set_version(int v) {
   838   flags.version = v;
   838   flags.version = v;
   839 }
   839 }
  1868       }
  1868       }
  1869     }
  1869     }
  1870   }
  1870   }
  1871 }
  1871 }
  1872 
  1872 
       
  1873 #endif // PRODUCT
  1873 
  1874 
  1874 // Printing operations
  1875 // Printing operations
  1875 
  1876 
  1876 void nmethod::print() const {
  1877 void nmethod::print() const {
  1877   ResourceMark rm;
  1878   ResourceMark rm;
  1946                                               oops_begin(),
  1947                                               oops_begin(),
  1947                                               oops_end(),
  1948                                               oops_end(),
  1948                                               oops_size());
  1949                                               oops_size());
  1949 }
  1950 }
  1950 
  1951 
       
  1952 void nmethod::print_code() {
       
  1953   HandleMark hm;
       
  1954   ResourceMark m;
       
  1955   Disassembler::decode(this);
       
  1956 }
       
  1957 
       
  1958 
       
  1959 #ifndef PRODUCT
  1951 
  1960 
  1952 void nmethod::print_scopes() {
  1961 void nmethod::print_scopes() {
  1953   // Find the first pc desc for all scopes in the code and print it.
  1962   // Find the first pc desc for all scopes in the code and print it.
  1954   ResourceMark rm;
  1963   ResourceMark rm;
  1955   for (PcDesc* p = scopes_pcs_begin(); p < scopes_pcs_end(); p++) {
  1964   for (PcDesc* p = scopes_pcs_begin(); p < scopes_pcs_end(); p++) {
  1974         tty->print_cr("   [nmethod<=klass]%s", k->external_name());
  1983         tty->print_cr("   [nmethod<=klass]%s", k->external_name());
  1975       }
  1984       }
  1976     }
  1985     }
  1977     deps.log_dependency();  // put it into the xml log also
  1986     deps.log_dependency();  // put it into the xml log also
  1978   }
  1987   }
  1979 }
       
  1980 
       
  1981 
       
  1982 void nmethod::print_code() {
       
  1983   HandleMark hm;
       
  1984   ResourceMark m;
       
  1985   Disassembler().decode(this);
       
  1986 }
  1988 }
  1987 
  1989 
  1988 
  1990 
  1989 void nmethod::print_relocations() {
  1991 void nmethod::print_relocations() {
  1990   ResourceMark m;       // in case methods get printed via the debugger
  1992   ResourceMark m;       // in case methods get printed via the debugger
  2019   for (PcDesc* p = scopes_pcs_begin(); p < scopes_pcs_end(); p++) {
  2021   for (PcDesc* p = scopes_pcs_begin(); p < scopes_pcs_end(); p++) {
  2020     p->print(this);
  2022     p->print(this);
  2021   }
  2023   }
  2022 }
  2024 }
  2023 
  2025 
       
  2026 #endif // PRODUCT
  2024 
  2027 
  2025 const char* nmethod::reloc_string_for(u_char* begin, u_char* end) {
  2028 const char* nmethod::reloc_string_for(u_char* begin, u_char* end) {
  2026   RelocIterator iter(this, begin, end);
  2029   RelocIterator iter(this, begin, end);
  2027   bool have_one = false;
  2030   bool have_one = false;
  2028   while (iter.next()) {
  2031   while (iter.next()) {
  2053     }
  2056     }
  2054   }
  2057   }
  2055   return have_one ? "other" : NULL;
  2058   return have_one ? "other" : NULL;
  2056 }
  2059 }
  2057 
  2060 
  2058 
       
  2059 // Return a the last scope in (begin..end]
  2061 // Return a the last scope in (begin..end]
  2060 ScopeDesc* nmethod::scope_desc_in(address begin, address end) {
  2062 ScopeDesc* nmethod::scope_desc_in(address begin, address end) {
  2061   PcDesc* p = pc_desc_near(begin+1);
  2063   PcDesc* p = pc_desc_near(begin+1);
  2062   if (p != NULL && p->real_pc(this) <= end) {
  2064   if (p != NULL && p->real_pc(this) <= end) {
  2063     return new ScopeDesc(this, p->scope_decode_offset(),
  2065     return new ScopeDesc(this, p->scope_decode_offset(),
  2076     for (int i = 0, imax = oms->size(); i < imax; i++) {
  2078     for (int i = 0, imax = oms->size(); i < imax; i++) {
  2077       OopMap* om = oms->at(i);
  2079       OopMap* om = oms->at(i);
  2078       address pc = base + om->offset();
  2080       address pc = base + om->offset();
  2079       if (pc > begin) {
  2081       if (pc > begin) {
  2080         if (pc <= end) {
  2082         if (pc <= end) {
  2081           st->fill_to(column);
  2083           st->move_to(column);
  2082           if (st == tty) {
  2084           st->print("; ");
  2083             st->print("; OopMap ");
  2085           om->print_on(st);
  2084             om->print();
       
  2085             tty->cr();
       
  2086           } else {
       
  2087             st->print_cr("; OopMap #%d offset:%d", i, om->offset());
       
  2088           }
       
  2089         }
  2086         }
  2090         break;
  2087         break;
  2091       }
  2088       }
  2092     }
  2089     }
  2093   }
  2090   }
       
  2091 
       
  2092   // Print any debug info present at this pc.
  2094   ScopeDesc* sd  = scope_desc_in(begin, end);
  2093   ScopeDesc* sd  = scope_desc_in(begin, end);
  2095   if (sd != NULL) {
  2094   if (sd != NULL) {
  2096     st->fill_to(column);
  2095     st->move_to(column);
  2097     if (sd->bci() == SynchronizationEntryBCI) {
  2096     if (sd->bci() == SynchronizationEntryBCI) {
  2098       st->print(";*synchronization entry");
  2097       st->print(";*synchronization entry");
  2099     } else {
  2098     } else {
  2100       if (sd->method().is_null()) {
  2099       if (sd->method().is_null()) {
  2101         tty->print("method is NULL");
  2100         st->print("method is NULL");
  2102       } else if (sd->method()->is_native()) {
  2101       } else if (sd->method()->is_native()) {
  2103         tty->print("method is native");
  2102         st->print("method is native");
  2104       } else {
  2103       } else {
  2105         address bcp  = sd->method()->bcp_from(sd->bci());
  2104         address bcp  = sd->method()->bcp_from(sd->bci());
  2106         Bytecodes::Code bc = Bytecodes::java_code_at(bcp);
  2105         Bytecodes::Code bc = Bytecodes::java_code_at(bcp);
  2107         st->print(";*%s", Bytecodes::name(bc));
  2106         st->print(";*%s", Bytecodes::name(bc));
  2108         switch (bc) {
  2107         switch (bc) {
  2135               st->print("<UNKNOWN>");
  2134               st->print("<UNKNOWN>");
  2136           }
  2135           }
  2137         }
  2136         }
  2138       }
  2137       }
  2139     }
  2138     }
  2140     st->cr();
  2139 
  2141     // Print all scopes
  2140     // Print all scopes
  2142     for (;sd != NULL; sd = sd->sender()) {
  2141     for (;sd != NULL; sd = sd->sender()) {
  2143       st->fill_to(column);
  2142       st->move_to(column);
  2144       st->print("; -");
  2143       st->print("; -");
  2145       if (sd->method().is_null()) {
  2144       if (sd->method().is_null()) {
  2146         tty->print("method is NULL");
  2145         st->print("method is NULL");
  2147       } else {
  2146       } else {
  2148         sd->method()->print_short_name(st);
  2147         sd->method()->print_short_name(st);
  2149       }
  2148       }
  2150       int lineno = sd->method()->line_number_from_bci(sd->bci());
  2149       int lineno = sd->method()->line_number_from_bci(sd->bci());
  2151       if (lineno != -1) {
  2150       if (lineno != -1) {
  2159 
  2158 
  2160   // Print relocation information
  2159   // Print relocation information
  2161   const char* str = reloc_string_for(begin, end);
  2160   const char* str = reloc_string_for(begin, end);
  2162   if (str != NULL) {
  2161   if (str != NULL) {
  2163     if (sd != NULL) st->cr();
  2162     if (sd != NULL) st->cr();
  2164     st->fill_to(column);
  2163     st->move_to(column);
  2165     st->print(";   {%s}", str);
  2164     st->print(";   {%s}", str);
  2166   }
  2165   }
  2167   int cont_offset = ImplicitExceptionTable(this).at(begin - instructions_begin());
  2166   int cont_offset = ImplicitExceptionTable(this).at(begin - instructions_begin());
  2168   if (cont_offset != 0) {
  2167   if (cont_offset != 0) {
  2169     st->fill_to(column);
  2168     st->move_to(column);
  2170     st->print("; implicit exception: dispatches to " INTPTR_FORMAT, instructions_begin() + cont_offset);
  2169     st->print("; implicit exception: dispatches to " INTPTR_FORMAT, instructions_begin() + cont_offset);
  2171   }
  2170   }
  2172 
  2171 
  2173 }
  2172 }
       
  2173 
       
  2174 #ifndef PRODUCT
  2174 
  2175 
  2175 void nmethod::print_value_on(outputStream* st) const {
  2176 void nmethod::print_value_on(outputStream* st) const {
  2176   print_on(st, "nmethod");
  2177   print_on(st, "nmethod");
  2177 }
  2178 }
  2178 
  2179