src/share/vm/utilities/decoder.hpp

Mon, 30 Jul 2012 10:25:52 -0400

author
zgu
date
Mon, 30 Jul 2012 10:25:52 -0400
changeset 3961
3b01d0321dfa
parent 3900
d2a62e0f25eb
child 5667
38f750491293
permissions
-rw-r--r--

7186778: MachO decoder implementation for MacOSX
Summary: Implementation of decoder for Apple's MacOSX. The implementation is based on the patch provided by Kevin Walls.
Reviewed-by: coleenp, kamg, kevinw

     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  */
    26 #ifndef SHARE_VM_UTILITIES_DECODER_HPP
    27 #define SHARE_VM_UTILITIES_DECODER_HPP
    29 #include "memory/allocation.hpp"
    30 #include "runtime/mutex.hpp"
    32 class AbstractDecoder : public CHeapObj<mtInternal> {
    33 public:
    34   // status code for decoding native C frame
    35   enum decoder_status {
    36          not_available = -10,  // real decoder is not available
    37          no_error = 0,         // successfully decoded frames
    38          out_of_memory,        // out of memory
    39          file_invalid,         // invalid elf file
    40          file_not_found,       // could not found symbol file (on windows), such as jvm.pdb or jvm.map
    41          helper_not_found,     // could not load dbghelp.dll (Windows only)
    42          helper_func_error,    // decoding functions not found (Windows only)
    43          helper_init_error     // SymInitialize failed (Windows only)
    44   };
    46   // decode an pc address to corresponding function name and an offset from the beginning of
    47   // the function
    48   virtual bool decode(address pc, char* buf, int buflen, int* offset,
    49     const char* modulepath = NULL) = 0;
    50   virtual bool decode(address pc, char* buf, int buflen, int* offset, const void* base) = 0;
    52   // demangle a C++ symbol
    53   virtual bool demangle(const char* symbol, char* buf, int buflen) = 0;
    54   // if the decoder can decode symbols in vm
    55   virtual bool can_decode_C_frame_in_vm() const = 0;
    57   virtual decoder_status status() const {
    58     return _decoder_status;
    59   }
    61   virtual bool has_error() const {
    62     return is_error(_decoder_status);
    63   }
    65   static bool is_error(decoder_status status) {
    66     return (status > 0);
    67   }
    69 protected:
    70   decoder_status  _decoder_status;
    71 };
    73 // Do nothing decoder
    74 class NullDecoder : public AbstractDecoder {
    75 public:
    76   NullDecoder() {
    77     _decoder_status = not_available;
    78   }
    80   ~NullDecoder() {};
    82   virtual bool decode(address pc, char* buf, int buflen, int* offset,
    83     const char* modulepath = NULL) {
    84     return false;
    85   }
    87   virtual bool decode(address pc, char* buf, int buflen, int* offset, const void* base) {
    88     return false;
    89   }
    91   virtual bool demangle(const char* symbol, char* buf, int buflen) {
    92     return false;
    93   }
    95   virtual bool can_decode_C_frame_in_vm() const {
    96     return false;
    97   }
    98 };
   101 class Decoder : AllStatic {
   102 public:
   103   static bool decode(address pc, char* buf, int buflen, int* offset, const char* modulepath = NULL);
   104   static bool decode(address pc, char* buf, int buflen, int* offset, const void* base);
   105   static bool demangle(const char* symbol, char* buf, int buflen);
   106   static bool can_decode_C_frame_in_vm();
   108   // shutdown shared instance
   109   static void shutdown();
   110 protected:
   111   // shared decoder instance, _shared_instance_lock is needed
   112   static AbstractDecoder* get_shared_instance();
   113   // a private instance for error handler. Error handler can be
   114   // triggered almost everywhere, including signal handler, where
   115   // no lock can be taken. So the shared decoder can not be used
   116   // in this scenario.
   117   static AbstractDecoder* get_error_handler_instance();
   119   static AbstractDecoder* create_decoder();
   120 private:
   121   static AbstractDecoder*     _shared_decoder;
   122   static AbstractDecoder*     _error_handler_decoder;
   123   static NullDecoder          _do_nothing_decoder;
   125 protected:
   126   static Mutex*               _shared_decoder_lock;
   127 };
   129 #endif // SHARE_VM_UTILITIES_DECODER_HPP

mercurial