hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/NMethod.java
changeset 38133 78b95467b9f1
parent 36818 b40330c06dea
child 46707 cbfdbefc6ea3
equal deleted inserted replaced
38132:ba888a4f352a 38133:78b95467b9f1
     1 /*
     1 /*
     2  * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 2000, 2016, 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.
    25 package sun.jvm.hotspot.code;
    25 package sun.jvm.hotspot.code;
    26 
    26 
    27 import java.io.*;
    27 import java.io.*;
    28 import java.util.*;
    28 import java.util.*;
    29 import sun.jvm.hotspot.debugger.*;
    29 import sun.jvm.hotspot.debugger.*;
    30 import sun.jvm.hotspot.memory.*;
       
    31 import sun.jvm.hotspot.oops.*;
    30 import sun.jvm.hotspot.oops.*;
    32 import sun.jvm.hotspot.runtime.*;
    31 import sun.jvm.hotspot.runtime.*;
    33 import sun.jvm.hotspot.types.*;
    32 import sun.jvm.hotspot.types.*;
    34 import sun.jvm.hotspot.utilities.*;
    33 import sun.jvm.hotspot.utilities.*;
    35 
    34 
    36 public class NMethod extends CodeBlob {
    35 public class NMethod extends CompiledMethod {
    37   private static long          pcDescSize;
    36   private static long          pcDescSize;
    38   private static AddressField  methodField;
       
    39   /** != InvocationEntryBci if this nmethod is an on-stack replacement method */
    37   /** != InvocationEntryBci if this nmethod is an on-stack replacement method */
    40   private static CIntegerField entryBCIField;
    38   private static CIntegerField entryBCIField;
    41   /** To support simple linked-list chaining of nmethods */
    39   /** To support simple linked-list chaining of nmethods */
    42   private static AddressField  osrLinkField;
    40   private static AddressField  osrLinkField;
    43   private static AddressField  scavengeRootLinkField;
    41   private static AddressField  scavengeRootLinkField;
    44   private static JByteField    scavengeRootStateField;
    42   private static JByteField    scavengeRootStateField;
    45 
    43 
    46   /** Offsets for different nmethod parts */
    44   /** Offsets for different nmethod parts */
    47   private static CIntegerField exceptionOffsetField;
    45   private static CIntegerField exceptionOffsetField;
    48   private static CIntegerField deoptOffsetField;
       
    49   private static CIntegerField deoptMhOffsetField;
       
    50   private static CIntegerField origPCOffsetField;
    46   private static CIntegerField origPCOffsetField;
    51   private static CIntegerField stubOffsetField;
    47   private static CIntegerField stubOffsetField;
    52   private static CIntegerField oopsOffsetField;
    48   private static CIntegerField oopsOffsetField;
    53   private static CIntegerField metadataOffsetField;
    49   private static CIntegerField metadataOffsetField;
    54   private static CIntegerField scopesDataOffsetField;
       
    55   private static CIntegerField scopesPCsOffsetField;
    50   private static CIntegerField scopesPCsOffsetField;
    56   private static CIntegerField dependenciesOffsetField;
    51   private static CIntegerField dependenciesOffsetField;
    57   private static CIntegerField handlerTableOffsetField;
    52   private static CIntegerField handlerTableOffsetField;
    58   private static CIntegerField nulChkTableOffsetField;
    53   private static CIntegerField nulChkTableOffsetField;
    59   private static CIntegerField nmethodEndOffsetField;
    54   private static CIntegerField nmethodEndOffsetField;
    89   }
    84   }
    90 
    85 
    91   private static void initialize(TypeDataBase db) {
    86   private static void initialize(TypeDataBase db) {
    92     Type type = db.lookupType("nmethod");
    87     Type type = db.lookupType("nmethod");
    93 
    88 
    94     methodField                 = type.getAddressField("_method");
       
    95     entryBCIField               = type.getCIntegerField("_entry_bci");
    89     entryBCIField               = type.getCIntegerField("_entry_bci");
    96     osrLinkField                = type.getAddressField("_osr_link");
    90     osrLinkField                = type.getAddressField("_osr_link");
    97     scavengeRootLinkField       = type.getAddressField("_scavenge_root_link");
    91     scavengeRootLinkField       = type.getAddressField("_scavenge_root_link");
    98     scavengeRootStateField      = type.getJByteField("_scavenge_root_state");
    92     scavengeRootStateField      = type.getJByteField("_scavenge_root_state");
    99 
    93 
   100     exceptionOffsetField        = type.getCIntegerField("_exception_offset");
    94     exceptionOffsetField        = type.getCIntegerField("_exception_offset");
   101     deoptOffsetField            = type.getCIntegerField("_deoptimize_offset");
       
   102     deoptMhOffsetField          = type.getCIntegerField("_deoptimize_mh_offset");
       
   103     origPCOffsetField           = type.getCIntegerField("_orig_pc_offset");
    95     origPCOffsetField           = type.getCIntegerField("_orig_pc_offset");
   104     stubOffsetField             = type.getCIntegerField("_stub_offset");
    96     stubOffsetField             = type.getCIntegerField("_stub_offset");
   105     oopsOffsetField             = type.getCIntegerField("_oops_offset");
    97     oopsOffsetField             = type.getCIntegerField("_oops_offset");
   106     metadataOffsetField         = type.getCIntegerField("_metadata_offset");
    98     metadataOffsetField         = type.getCIntegerField("_metadata_offset");
   107     scopesDataOffsetField       = type.getCIntegerField("_scopes_data_offset");
       
   108     scopesPCsOffsetField        = type.getCIntegerField("_scopes_pcs_offset");
    99     scopesPCsOffsetField        = type.getCIntegerField("_scopes_pcs_offset");
   109     dependenciesOffsetField     = type.getCIntegerField("_dependencies_offset");
   100     dependenciesOffsetField     = type.getCIntegerField("_dependencies_offset");
   110     handlerTableOffsetField     = type.getCIntegerField("_handler_table_offset");
   101     handlerTableOffsetField     = type.getCIntegerField("_handler_table_offset");
   111     nulChkTableOffsetField      = type.getCIntegerField("_nul_chk_table_offset");
   102     nulChkTableOffsetField      = type.getCIntegerField("_nul_chk_table_offset");
   112     nmethodEndOffsetField       = type.getCIntegerField("_nmethod_end_offset");
   103     nmethodEndOffsetField       = type.getCIntegerField("_nmethod_end_offset");
   121 
   112 
   122   public NMethod(Address addr) {
   113   public NMethod(Address addr) {
   123     super(addr);
   114     super(addr);
   124   }
   115   }
   125 
   116 
   126 
       
   127   // Accessors
   117   // Accessors
   128   public Address getAddress() {
   118   public Address getAddress() {
   129     return addr;
   119     return addr;
   130   }
       
   131 
       
   132   public Method getMethod() {
       
   133     return (Method)Metadata.instantiateWrapperFor(methodField.getValue(addr));
       
   134   }
   120   }
   135 
   121 
   136   // Type info
   122   // Type info
   137   public boolean isNMethod()      { return true;                    }
   123   public boolean isNMethod()      { return true;                    }
   138   public boolean isJavaMethod()   { return !getMethod().isNative(); }
   124   public boolean isJavaMethod()   { return !getMethod().isNative(); }
   143   public Address constantsBegin()       { return contentBegin();                                     }
   129   public Address constantsBegin()       { return contentBegin();                                     }
   144   public Address constantsEnd()         { return getEntryPoint();                                    }
   130   public Address constantsEnd()         { return getEntryPoint();                                    }
   145   public Address instsBegin()           { return codeBegin();                                        }
   131   public Address instsBegin()           { return codeBegin();                                        }
   146   public Address instsEnd()             { return headerBegin().addOffsetTo(getStubOffset());         }
   132   public Address instsEnd()             { return headerBegin().addOffsetTo(getStubOffset());         }
   147   public Address exceptionBegin()       { return headerBegin().addOffsetTo(getExceptionOffset());    }
   133   public Address exceptionBegin()       { return headerBegin().addOffsetTo(getExceptionOffset());    }
   148   public Address deoptHandlerBegin()    { return headerBegin().addOffsetTo(getDeoptOffset());        }
       
   149   public Address deoptMhHandlerBegin()  { return headerBegin().addOffsetTo(getDeoptMhOffset());      }
       
   150   public Address stubBegin()            { return headerBegin().addOffsetTo(getStubOffset());         }
   134   public Address stubBegin()            { return headerBegin().addOffsetTo(getStubOffset());         }
   151   public Address stubEnd()              { return headerBegin().addOffsetTo(getOopsOffset());         }
   135   public Address stubEnd()              { return headerBegin().addOffsetTo(getOopsOffset());         }
   152   public Address oopsBegin()            { return headerBegin().addOffsetTo(getOopsOffset());         }
   136   public Address oopsBegin()            { return headerBegin().addOffsetTo(getOopsOffset());         }
   153   public Address oopsEnd()              { return headerBegin().addOffsetTo(getMetadataOffset());     }
   137   public Address oopsEnd()              { return headerBegin().addOffsetTo(getMetadataOffset());     }
   154   public Address metadataBegin()        { return headerBegin().addOffsetTo(getMetadataOffset());     }
   138   public Address metadataBegin()        { return headerBegin().addOffsetTo(getMetadataOffset());     }
   155   public Address metadataEnd()          { return headerBegin().addOffsetTo(getScopesDataOffset());   }
   139   public Address metadataEnd()          { return scopesDataBegin();                                  }
   156   public Address scopesDataBegin()      { return headerBegin().addOffsetTo(getScopesDataOffset());   }
       
   157   public Address scopesDataEnd()        { return headerBegin().addOffsetTo(getScopesPCsOffset());    }
   140   public Address scopesDataEnd()        { return headerBegin().addOffsetTo(getScopesPCsOffset());    }
   158   public Address scopesPCsBegin()       { return headerBegin().addOffsetTo(getScopesPCsOffset());    }
   141   public Address scopesPCsBegin()       { return headerBegin().addOffsetTo(getScopesPCsOffset());    }
   159   public Address scopesPCsEnd()         { return headerBegin().addOffsetTo(getDependenciesOffset()); }
   142   public Address scopesPCsEnd()         { return headerBegin().addOffsetTo(getDependenciesOffset()); }
   160   public Address dependenciesBegin()    { return headerBegin().addOffsetTo(getDependenciesOffset()); }
   143   public Address dependenciesBegin()    { return headerBegin().addOffsetTo(getDependenciesOffset()); }
   161   public Address dependenciesEnd()      { return headerBegin().addOffsetTo(getHandlerTableOffset()); }
   144   public Address dependenciesEnd()      { return headerBegin().addOffsetTo(getHandlerTableOffset()); }
   460   /** Support for code generation. Only here for proof-of-concept. */
   443   /** Support for code generation. Only here for proof-of-concept. */
   461   public static int getEntryPointOffset()            { return (int) entryPointField.getOffset();            }
   444   public static int getEntryPointOffset()            { return (int) entryPointField.getOffset();            }
   462   public static int getVerifiedEntryPointOffset()    { return (int) verifiedEntryPointField.getOffset();    }
   445   public static int getVerifiedEntryPointOffset()    { return (int) verifiedEntryPointField.getOffset();    }
   463   public static int getOSREntryPointOffset()         { return (int) osrEntryPointField.getOffset();         }
   446   public static int getOSREntryPointOffset()         { return (int) osrEntryPointField.getOffset();         }
   464   public static int getEntryBCIOffset()              { return (int) entryBCIField.getOffset();              }
   447   public static int getEntryBCIOffset()              { return (int) entryBCIField.getOffset();              }
   465   /** NOTE: renamed from "method_offset_in_bytes" */
       
   466   public static int getMethodOffset()                { return (int) methodField.getOffset();                }
       
   467 
   448 
   468   public void print() {
   449   public void print() {
   469     printOn(System.out);
   450     printOn(System.out);
   470   }
   451   }
   471 
   452 
   539   // Internals only below this point
   520   // Internals only below this point
   540   //
   521   //
   541 
   522 
   542   private int getEntryBCI()           { return (int) entryBCIField          .getValue(addr); }
   523   private int getEntryBCI()           { return (int) entryBCIField          .getValue(addr); }
   543   private int getExceptionOffset()    { return (int) exceptionOffsetField   .getValue(addr); }
   524   private int getExceptionOffset()    { return (int) exceptionOffsetField   .getValue(addr); }
   544   private int getDeoptOffset()        { return (int) deoptOffsetField       .getValue(addr); }
       
   545   private int getDeoptMhOffset()      { return (int) deoptMhOffsetField     .getValue(addr); }
       
   546   private int getStubOffset()         { return (int) stubOffsetField        .getValue(addr); }
   525   private int getStubOffset()         { return (int) stubOffsetField        .getValue(addr); }
   547   private int getOopsOffset()         { return (int) oopsOffsetField        .getValue(addr); }
   526   private int getOopsOffset()         { return (int) oopsOffsetField        .getValue(addr); }
   548   private int getMetadataOffset()     { return (int) metadataOffsetField    .getValue(addr); }
   527   private int getMetadataOffset()     { return (int) metadataOffsetField    .getValue(addr); }
   549   private int getScopesDataOffset()   { return (int) scopesDataOffsetField  .getValue(addr); }
       
   550   private int getScopesPCsOffset()    { return (int) scopesPCsOffsetField   .getValue(addr); }
   528   private int getScopesPCsOffset()    { return (int) scopesPCsOffsetField   .getValue(addr); }
   551   private int getDependenciesOffset() { return (int) dependenciesOffsetField.getValue(addr); }
   529   private int getDependenciesOffset() { return (int) dependenciesOffsetField.getValue(addr); }
   552   private int getHandlerTableOffset() { return (int) handlerTableOffsetField.getValue(addr); }
   530   private int getHandlerTableOffset() { return (int) handlerTableOffsetField.getValue(addr); }
   553   private int getNulChkTableOffset()  { return (int) nulChkTableOffsetField .getValue(addr); }
   531   private int getNulChkTableOffset()  { return (int) nulChkTableOffsetField .getValue(addr); }
   554   private int getNMethodEndOffset()   { return (int) nmethodEndOffsetField  .getValue(addr); }
   532   private int getNMethodEndOffset()   { return (int) nmethodEndOffsetField  .getValue(addr); }