hotspot/agent/src/share/classes/sun/jvm/hotspot/code/NMethod.java
changeset 5686 5435e77aa3df
parent 4095 6e0acfda1d47
child 5702 201c5cde25bb
equal deleted inserted replaced
5539:261ecc5bb65e 5686:5435e77aa3df
     1 /*
     1 /*
     2  * Copyright 2000-2009 Sun Microsystems, Inc.  All Rights Reserved.
     2  * Copyright 2000-2010 Sun Microsystems, Inc.  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.
    47   /** Offsets for different nmethod parts */
    47   /** Offsets for different nmethod parts */
    48   private static CIntegerField exceptionOffsetField;
    48   private static CIntegerField exceptionOffsetField;
    49   private static CIntegerField deoptOffsetField;
    49   private static CIntegerField deoptOffsetField;
    50   private static CIntegerField origPCOffsetField;
    50   private static CIntegerField origPCOffsetField;
    51   private static CIntegerField stubOffsetField;
    51   private static CIntegerField stubOffsetField;
       
    52   private static CIntegerField oopsOffsetField;
    52   private static CIntegerField scopesDataOffsetField;
    53   private static CIntegerField scopesDataOffsetField;
    53   private static CIntegerField scopesPCsOffsetField;
    54   private static CIntegerField scopesPCsOffsetField;
    54   private static CIntegerField dependenciesOffsetField;
    55   private static CIntegerField dependenciesOffsetField;
    55   private static CIntegerField handlerTableOffsetField;
    56   private static CIntegerField handlerTableOffsetField;
    56   private static CIntegerField nulChkTableOffsetField;
    57   private static CIntegerField nulChkTableOffsetField;
    96 
    97 
    97     exceptionOffsetField        = type.getCIntegerField("_exception_offset");
    98     exceptionOffsetField        = type.getCIntegerField("_exception_offset");
    98     deoptOffsetField            = type.getCIntegerField("_deoptimize_offset");
    99     deoptOffsetField            = type.getCIntegerField("_deoptimize_offset");
    99     origPCOffsetField           = type.getCIntegerField("_orig_pc_offset");
   100     origPCOffsetField           = type.getCIntegerField("_orig_pc_offset");
   100     stubOffsetField             = type.getCIntegerField("_stub_offset");
   101     stubOffsetField             = type.getCIntegerField("_stub_offset");
       
   102     oopsOffsetField             = type.getCIntegerField("_oops_offset");
   101     scopesDataOffsetField       = type.getCIntegerField("_scopes_data_offset");
   103     scopesDataOffsetField       = type.getCIntegerField("_scopes_data_offset");
   102     scopesPCsOffsetField        = type.getCIntegerField("_scopes_pcs_offset");
   104     scopesPCsOffsetField        = type.getCIntegerField("_scopes_pcs_offset");
   103     dependenciesOffsetField     = type.getCIntegerField("_dependencies_offset");
   105     dependenciesOffsetField     = type.getCIntegerField("_dependencies_offset");
   104     handlerTableOffsetField     = type.getCIntegerField("_handler_table_offset");
   106     handlerTableOffsetField     = type.getCIntegerField("_handler_table_offset");
   105     nulChkTableOffsetField      = type.getCIntegerField("_nul_chk_table_offset");
   107     nulChkTableOffsetField      = type.getCIntegerField("_nul_chk_table_offset");
   139   public Address codeBegin()            { return getEntryPoint();                                    }
   141   public Address codeBegin()            { return getEntryPoint();                                    }
   140   public Address codeEnd()              { return headerBegin().addOffsetTo(getStubOffset());         }
   142   public Address codeEnd()              { return headerBegin().addOffsetTo(getStubOffset());         }
   141   public Address exceptionBegin()       { return headerBegin().addOffsetTo(getExceptionOffset());    }
   143   public Address exceptionBegin()       { return headerBegin().addOffsetTo(getExceptionOffset());    }
   142   public Address deoptBegin()           { return headerBegin().addOffsetTo(getDeoptOffset());        }
   144   public Address deoptBegin()           { return headerBegin().addOffsetTo(getDeoptOffset());        }
   143   public Address stubBegin()            { return headerBegin().addOffsetTo(getStubOffset());         }
   145   public Address stubBegin()            { return headerBegin().addOffsetTo(getStubOffset());         }
   144   public Address stubEnd()              { return headerBegin().addOffsetTo(getScopesDataOffset());   }
   146   public Address stubEnd()              { return headerBegin().addOffsetTo(getOopsOffset());         }
       
   147   public Address oopsBegin()            { return headerBegin().addOffsetTo(getOopsOffset());         }
       
   148   public Address oopsEnd()              { return headerBegin().addOffsetTo(getScopesDataOffset());   }
   145   public Address scopesDataBegin()      { return headerBegin().addOffsetTo(getScopesDataOffset());   }
   149   public Address scopesDataBegin()      { return headerBegin().addOffsetTo(getScopesDataOffset());   }
   146   public Address scopesDataEnd()        { return headerBegin().addOffsetTo(getScopesPCsOffset());    }
   150   public Address scopesDataEnd()        { return headerBegin().addOffsetTo(getScopesPCsOffset());    }
   147   public Address scopesPCsBegin()       { return headerBegin().addOffsetTo(getScopesPCsOffset());    }
   151   public Address scopesPCsBegin()       { return headerBegin().addOffsetTo(getScopesPCsOffset());    }
   148   public Address scopesPCsEnd()         { return headerBegin().addOffsetTo(getDependenciesOffset()); }
   152   public Address scopesPCsEnd()         { return headerBegin().addOffsetTo(getDependenciesOffset()); }
   149   public Address dependenciesBegin()    { return headerBegin().addOffsetTo(getDependenciesOffset()); }
   153   public Address dependenciesBegin()    { return headerBegin().addOffsetTo(getDependenciesOffset()); }
   154   public Address nulChkTableEnd()       { return headerBegin().addOffsetTo(getNMethodEndOffset());   }
   158   public Address nulChkTableEnd()       { return headerBegin().addOffsetTo(getNMethodEndOffset());   }
   155 
   159 
   156   public int constantsSize()            { return (int) constantsEnd()   .minus(constantsBegin());    }
   160   public int constantsSize()            { return (int) constantsEnd()   .minus(constantsBegin());    }
   157   public int codeSize()                 { return (int) codeEnd()        .minus(codeBegin());         }
   161   public int codeSize()                 { return (int) codeEnd()        .minus(codeBegin());         }
   158   public int stubSize()                 { return (int) stubEnd()        .minus(stubBegin());         }
   162   public int stubSize()                 { return (int) stubEnd()        .minus(stubBegin());         }
       
   163   public int oopsSize()                 { return (int) oopsEnd()        .minus(oopsBegin());         }
   159   public int scopesDataSize()           { return (int) scopesDataEnd()  .minus(scopesDataBegin());   }
   164   public int scopesDataSize()           { return (int) scopesDataEnd()  .minus(scopesDataBegin());   }
   160   public int scopesPCsSize()            { return (int) scopesPCsEnd()   .minus(scopesPCsBegin());    }
   165   public int scopesPCsSize()            { return (int) scopesPCsEnd()   .minus(scopesPCsBegin());    }
   161   public int dependenciesSize()         { return (int) dependenciesEnd().minus(dependenciesBegin()); }
   166   public int dependenciesSize()         { return (int) dependenciesEnd().minus(dependenciesBegin()); }
   162   public int handlerTableSize()         { return (int) handlerTableEnd().minus(handlerTableBegin()); }
   167   public int handlerTableSize()         { return (int) handlerTableEnd().minus(handlerTableBegin()); }
   163   public int nulChkTableSize()          { return (int) nulChkTableEnd() .minus(nulChkTableBegin());  }
   168   public int nulChkTableSize()          { return (int) nulChkTableEnd() .minus(nulChkTableBegin());  }
   176   }
   181   }
   177 
   182 
   178   public boolean constantsContains   (Address addr) { return constantsBegin()   .lessThanOrEqual(addr) && constantsEnd()   .greaterThan(addr); }
   183   public boolean constantsContains   (Address addr) { return constantsBegin()   .lessThanOrEqual(addr) && constantsEnd()   .greaterThan(addr); }
   179   public boolean codeContains        (Address addr) { return codeBegin()        .lessThanOrEqual(addr) && codeEnd()        .greaterThan(addr); }
   184   public boolean codeContains        (Address addr) { return codeBegin()        .lessThanOrEqual(addr) && codeEnd()        .greaterThan(addr); }
   180   public boolean stubContains        (Address addr) { return stubBegin()        .lessThanOrEqual(addr) && stubEnd()        .greaterThan(addr); }
   185   public boolean stubContains        (Address addr) { return stubBegin()        .lessThanOrEqual(addr) && stubEnd()        .greaterThan(addr); }
       
   186   public boolean oopsContains        (Address addr) { return oopsBegin()        .lessThanOrEqual(addr) && oopsEnd()        .greaterThan(addr); }
   181   public boolean scopesDataContains  (Address addr) { return scopesDataBegin()  .lessThanOrEqual(addr) && scopesDataEnd()  .greaterThan(addr); }
   187   public boolean scopesDataContains  (Address addr) { return scopesDataBegin()  .lessThanOrEqual(addr) && scopesDataEnd()  .greaterThan(addr); }
   182   public boolean scopesPCsContains   (Address addr) { return scopesPCsBegin()   .lessThanOrEqual(addr) && scopesPCsEnd()   .greaterThan(addr); }
   188   public boolean scopesPCsContains   (Address addr) { return scopesPCsBegin()   .lessThanOrEqual(addr) && scopesPCsEnd()   .greaterThan(addr); }
   183   public boolean handlerTableContains(Address addr) { return handlerTableBegin().lessThanOrEqual(addr) && handlerTableEnd().greaterThan(addr); }
   189   public boolean handlerTableContains(Address addr) { return handlerTableBegin().lessThanOrEqual(addr) && handlerTableEnd().greaterThan(addr); }
   184   public boolean nulChkTableContains (Address addr) { return nulChkTableBegin() .lessThanOrEqual(addr) && nulChkTableEnd() .greaterThan(addr); }
   190   public boolean nulChkTableContains (Address addr) { return nulChkTableBegin() .lessThanOrEqual(addr) && nulChkTableEnd() .greaterThan(addr); }
   185 
   191 
   186   /** Entry points */
   192   /** Entry points */
   187   public Address getEntryPoint()         { return entryPointField.getValue(addr);         }
   193   public Address getEntryPoint()         { return entryPointField.getValue(addr);         }
   188   public Address getVerifiedEntryPoint() { return verifiedEntryPointField.getValue(addr); }
   194   public Address getVerifiedEntryPoint() { return verifiedEntryPointField.getValue(addr); }
       
   195 
       
   196   /** Support for oops in scopes and relocs. Note: index 0 is reserved for null. */
       
   197   public OopHandle getOopAt(int index) {
       
   198     if (index == 0) return null;
       
   199     if (Assert.ASSERTS_ENABLED) {
       
   200       Assert.that(index > 0 && index <= oopsSize(), "must be a valid non-zero index");
       
   201     }
       
   202     return oopsBegin().getOopHandleAt((index - 1) * VM.getVM().getOopSize());
       
   203   }
   189 
   204 
   190   // FIXME: add interpreter_entry_point()
   205   // FIXME: add interpreter_entry_point()
   191   // FIXME: add lazy_interpreter_entry_point() for C2
   206   // FIXME: add lazy_interpreter_entry_point() for C2
   192 
   207 
   193   // **********
   208   // **********
   336 
   351 
   337   public void print() {
   352   public void print() {
   338     printOn(System.out);
   353     printOn(System.out);
   339   }
   354   }
   340 
   355 
       
   356   protected void printComponentsOn(PrintStream tty) {
       
   357     // FIXME: add relocation information
       
   358     tty.println(" instructions: [" + instructionsBegin() + ", " + instructionsEnd() + "), " +
       
   359                 " data: [" + dataBegin() + ", " + dataEnd() + "), " +
       
   360                 " oops: [" + oopsBegin() + ", " + oopsEnd() + "), " +
       
   361                 " frame size: " + getFrameSize());
       
   362   }
       
   363 
   341   public String toString() {
   364   public String toString() {
   342     Method method = getMethod();
   365     Method method = getMethod();
   343     return "NMethod for " +
   366     return "NMethod for " +
   344             method.getMethodHolder().getName().asString() + "." +
   367             method.getMethodHolder().getName().asString() + "." +
   345             method.getName().asString() + method.getSignature().asString() + "==>n" +
   368             method.getName().asString() + method.getSignature().asString() + "==>n" +
   365 
   388 
   366   private int getEntryBCI()           { return (int) entryBCIField          .getValue(addr); }
   389   private int getEntryBCI()           { return (int) entryBCIField          .getValue(addr); }
   367   private int getExceptionOffset()    { return (int) exceptionOffsetField   .getValue(addr); }
   390   private int getExceptionOffset()    { return (int) exceptionOffsetField   .getValue(addr); }
   368   private int getDeoptOffset()        { return (int) deoptOffsetField       .getValue(addr); }
   391   private int getDeoptOffset()        { return (int) deoptOffsetField       .getValue(addr); }
   369   private int getStubOffset()         { return (int) stubOffsetField        .getValue(addr); }
   392   private int getStubOffset()         { return (int) stubOffsetField        .getValue(addr); }
       
   393   private int getOopsOffset()         { return (int) oopsOffsetField        .getValue(addr); }
   370   private int getScopesDataOffset()   { return (int) scopesDataOffsetField  .getValue(addr); }
   394   private int getScopesDataOffset()   { return (int) scopesDataOffsetField  .getValue(addr); }
   371   private int getScopesPCsOffset()    { return (int) scopesPCsOffsetField   .getValue(addr); }
   395   private int getScopesPCsOffset()    { return (int) scopesPCsOffsetField   .getValue(addr); }
   372   private int getDependenciesOffset() { return (int) dependenciesOffsetField.getValue(addr); }
   396   private int getDependenciesOffset() { return (int) dependenciesOffsetField.getValue(addr); }
   373   private int getHandlerTableOffset() { return (int) handlerTableOffsetField.getValue(addr); }
   397   private int getHandlerTableOffset() { return (int) handlerTableOffsetField.getValue(addr); }
   374   private int getNulChkTableOffset()  { return (int) nulChkTableOffsetField .getValue(addr); }
   398   private int getNulChkTableOffset()  { return (int) nulChkTableOffsetField .getValue(addr); }