src/share/vm/code/nmethod.hpp

changeset 1635
ba263cfb7611
parent 1590
4e6abf09f540
child 1636
24128c2ffa87
     1.1 --- a/src/share/vm/code/nmethod.hpp	Thu Jan 28 20:41:37 2010 -0800
     1.2 +++ b/src/share/vm/code/nmethod.hpp	Fri Jan 29 12:13:05 2010 +0100
     1.3 @@ -1,5 +1,5 @@
     1.4  /*
     1.5 - * Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
     1.6 + * Copyright 1997-2010 Sun Microsystems, Inc.  All Rights Reserved.
     1.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     1.8   *
     1.9   * This code is free software; you can redistribute it and/or modify it
    1.10 @@ -145,8 +145,12 @@
    1.11  
    1.12    // Offsets for different nmethod parts
    1.13    int _exception_offset;
    1.14 -  // All deoptee's will resume execution at this location described by this offset
    1.15 +  // All deoptee's will resume execution at this location described by
    1.16 +  // this offset.
    1.17    int _deoptimize_offset;
    1.18 +  // All deoptee's at a MethodHandle call site will resume execution
    1.19 +  // at this location described by this offset.
    1.20 +  int _deoptimize_mh_offset;
    1.21  #ifdef HAVE_DTRACE_H
    1.22    int _trap_offset;
    1.23  #endif // def HAVE_DTRACE_H
    1.24 @@ -329,24 +333,25 @@
    1.25    bool is_compiled_by_c2() const;
    1.26  
    1.27    // boundaries for different parts
    1.28 -  address code_begin         () const             { return _entry_point; }
    1.29 -  address code_end           () const             { return           header_begin() + _stub_offset          ; }
    1.30 -  address exception_begin    () const             { return           header_begin() + _exception_offset     ; }
    1.31 -  address deopt_handler_begin() const             { return           header_begin() + _deoptimize_offset    ; }
    1.32 -  address stub_begin         () const             { return           header_begin() + _stub_offset          ; }
    1.33 -  address stub_end           () const             { return           header_begin() + _consts_offset        ; }
    1.34 -  address consts_begin       () const             { return           header_begin() + _consts_offset        ; }
    1.35 -  address consts_end         () const             { return           header_begin() + _scopes_data_offset   ; }
    1.36 -  address scopes_data_begin  () const             { return           header_begin() + _scopes_data_offset   ; }
    1.37 -  address scopes_data_end    () const             { return           header_begin() + _scopes_pcs_offset    ; }
    1.38 -  PcDesc* scopes_pcs_begin   () const             { return (PcDesc*)(header_begin() + _scopes_pcs_offset   ); }
    1.39 -  PcDesc* scopes_pcs_end     () const             { return (PcDesc*)(header_begin() + _dependencies_offset); }
    1.40 -  address dependencies_begin () const             { return           header_begin() + _dependencies_offset ; }
    1.41 -  address dependencies_end   () const             { return           header_begin() + _handler_table_offset ; }
    1.42 -  address handler_table_begin() const             { return           header_begin() + _handler_table_offset ; }
    1.43 -  address handler_table_end  () const             { return           header_begin() + _nul_chk_table_offset   ; }
    1.44 -  address nul_chk_table_begin() const             { return           header_begin() + _nul_chk_table_offset ; }
    1.45 -  address nul_chk_table_end  () const             { return           header_begin() + _nmethod_end_offset   ; }
    1.46 +  address code_begin            () const          { return _entry_point; }
    1.47 +  address code_end              () const          { return           header_begin() + _stub_offset          ; }
    1.48 +  address exception_begin       () const          { return           header_begin() + _exception_offset     ; }
    1.49 +  address deopt_handler_begin   () const          { return           header_begin() + _deoptimize_offset    ; }
    1.50 +  address deopt_mh_handler_begin() const          { return           header_begin() + _deoptimize_mh_offset ; }
    1.51 +  address stub_begin            () const          { return           header_begin() + _stub_offset          ; }
    1.52 +  address stub_end              () const          { return           header_begin() + _consts_offset        ; }
    1.53 +  address consts_begin          () const          { return           header_begin() + _consts_offset        ; }
    1.54 +  address consts_end            () const          { return           header_begin() + _scopes_data_offset   ; }
    1.55 +  address scopes_data_begin     () const          { return           header_begin() + _scopes_data_offset   ; }
    1.56 +  address scopes_data_end       () const          { return           header_begin() + _scopes_pcs_offset    ; }
    1.57 +  PcDesc* scopes_pcs_begin      () const          { return (PcDesc*)(header_begin() + _scopes_pcs_offset   ); }
    1.58 +  PcDesc* scopes_pcs_end        () const          { return (PcDesc*)(header_begin() + _dependencies_offset) ; }
    1.59 +  address dependencies_begin    () const          { return           header_begin() + _dependencies_offset  ; }
    1.60 +  address dependencies_end      () const          { return           header_begin() + _handler_table_offset ; }
    1.61 +  address handler_table_begin   () const          { return           header_begin() + _handler_table_offset ; }
    1.62 +  address handler_table_end     () const          { return           header_begin() + _nul_chk_table_offset ; }
    1.63 +  address nul_chk_table_begin   () const          { return           header_begin() + _nul_chk_table_offset ; }
    1.64 +  address nul_chk_table_end     () const          { return           header_begin() + _nmethod_end_offset   ; }
    1.65  
    1.66    int code_size         () const                  { return      code_end         () -      code_begin         (); }
    1.67    int stub_size         () const                  { return      stub_end         () -      stub_begin         (); }
    1.68 @@ -515,7 +520,7 @@
    1.69   private:
    1.70    ScopeDesc* scope_desc_in(address begin, address end);
    1.71  
    1.72 -  address* orig_pc_addr(const frame* fr ) { return (address*) ((address)fr->unextended_sp() + _orig_pc_offset); }
    1.73 +  address* orig_pc_addr(const frame* fr) { return (address*) ((address)fr->unextended_sp() + _orig_pc_offset); }
    1.74  
    1.75    PcDesc* find_pc_desc_internal(address pc, bool approximate);
    1.76  
    1.77 @@ -538,13 +543,17 @@
    1.78    void copy_scopes_pcs(PcDesc* pcs, int count);
    1.79    void copy_scopes_data(address buffer, int size);
    1.80  
    1.81 -  // deopt
    1.82 -  // return true is the pc is one would expect if the frame is being deopted.
    1.83 -  bool is_deopt_pc(address pc);
    1.84 +  // Deopt
    1.85 +  // Return true is the PC is one would expect if the frame is being deopted.
    1.86 +  bool is_deopt_pc      (address pc) { return is_deopt_entry(pc) || is_deopt_mh_entry(pc); }
    1.87 +  bool is_deopt_entry   (address pc) { return pc == deopt_handler_begin(); }
    1.88 +  bool is_deopt_mh_entry(address pc) { return pc == deopt_mh_handler_begin(); }
    1.89    // Accessor/mutator for the original pc of a frame before a frame was deopted.
    1.90    address get_original_pc(const frame* fr) { return *orig_pc_addr(fr); }
    1.91    void    set_original_pc(const frame* fr, address pc) { *orig_pc_addr(fr) = pc; }
    1.92  
    1.93 +  static address get_deopt_original_pc(const frame* fr);
    1.94 +
    1.95    // MethodHandle
    1.96    bool is_method_handle_return(address return_pc);
    1.97  

mercurial