src/share/vm/runtime/stubCodeGenerator.hpp

Wed, 27 Apr 2016 01:25:04 +0800

author
aoqi
date
Wed, 27 Apr 2016 01:25:04 +0800
changeset 0
f90c822e73f8
child 6876
710a3c8b516e
permissions
-rw-r--r--

Initial load
http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/
changeset: 6782:28b50d07f6f8
tag: jdk8u25-b17

     1 /*
     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.
     4  *
     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
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #ifndef SHARE_VM_RUNTIME_STUBCODEGENERATOR_HPP
    26 #define SHARE_VM_RUNTIME_STUBCODEGENERATOR_HPP
    28 #include "asm/assembler.hpp"
    29 #include "memory/allocation.hpp"
    31 // All the basic framework for stubcode generation/debugging/printing.
    34 // A StubCodeDesc describes a piece of generated code (usually stubs).
    35 // This information is mainly useful for debugging and printing.
    36 // Currently, code descriptors are simply chained in a linked list,
    37 // this may have to change if searching becomes too slow.
    39 class StubCodeDesc: public CHeapObj<mtCode> {
    40  protected:
    41   static StubCodeDesc* _list;                  // the list of all descriptors
    42   static int           _count;                 // length of list
    44   StubCodeDesc*        _next;                  // the next element in the linked list
    45   const char*          _group;                 // the group to which the stub code belongs
    46   const char*          _name;                  // the name assigned to the stub code
    47   int                  _index;                 // serial number assigned to the stub
    48   address              _begin;                 // points to the first byte of the stub code    (included)
    49   address              _end;                   // points to the first byte after the stub code (excluded)
    51   void set_end(address end) {
    52     assert(_begin <= end, "begin & end not properly ordered");
    53     _end = end;
    54   }
    56   void set_begin(address begin) {
    57     assert(begin >= _begin, "begin may not decrease");
    58     assert(_end == NULL || begin <= _end, "begin & end not properly ordered");
    59     _begin = begin;
    60   }
    62   friend class StubCodeMark;
    63   friend class StubCodeGenerator;
    65  public:
    66   static StubCodeDesc* desc_for(address pc);     // returns the code descriptor for the code containing pc or NULL
    67   static StubCodeDesc* desc_for_index(int);      // returns the code descriptor for the index or NULL
    68   static const char*   name_for(address pc);     // returns the name of the code containing pc or NULL
    70   StubCodeDesc(const char* group, const char* name, address begin) {
    71     assert(name != NULL, "no name specified");
    72     _next           = _list;
    73     _group          = group;
    74     _name           = name;
    75     _index          = ++_count; // (never zero)
    76     _begin          = begin;
    77     _end            = NULL;
    78     _list           = this;
    79   };
    81   const char* group() const                      { return _group; }
    82   const char* name() const                       { return _name; }
    83   int         index() const                      { return _index; }
    84   address     begin() const                      { return _begin; }
    85   address     end() const                        { return _end; }
    86   int         size_in_bytes() const              { return _end - _begin; }
    87   bool        contains(address pc) const         { return _begin <= pc && pc < _end; }
    88   void        print_on(outputStream* st) const;
    89   void        print() const                      { print_on(tty); }
    90 };
    92 // The base class for all stub-generating code generators.
    93 // Provides utility functions.
    95 class StubCodeGenerator: public StackObj {
    96  protected:
    97   MacroAssembler*  _masm;
    99   StubCodeDesc* _first_stub;
   100   StubCodeDesc* _last_stub;
   101   bool _print_code;
   103  public:
   104   StubCodeGenerator(CodeBuffer* code, bool print_code = false);
   105   ~StubCodeGenerator();
   107   MacroAssembler* assembler() const              { return _masm; }
   109   virtual void stub_prolog(StubCodeDesc* cdesc); // called by StubCodeMark constructor
   110   virtual void stub_epilog(StubCodeDesc* cdesc); // called by StubCodeMark destructor
   111 };
   114 // Stack-allocated helper class used to assciate a stub code with a name.
   115 // All stub code generating functions that use a StubCodeMark will be registered
   116 // in the global StubCodeDesc list and the generated stub code can be identified
   117 // later via an address pointing into it.
   119 class StubCodeMark: public StackObj {
   120  protected:
   121   StubCodeGenerator* _cgen;
   122   StubCodeDesc*      _cdesc;
   124  public:
   125   StubCodeMark(StubCodeGenerator* cgen, const char* group, const char* name);
   126   ~StubCodeMark();
   128 };
   130 #endif // SHARE_VM_RUNTIME_STUBCODEGENERATOR_HPP

mercurial