src/share/vm/utilities/decoder.hpp

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 21,105 **** * questions. * */ ! #ifndef __DECODER_HPP ! #define __DECODER_HPP #include "memory/allocation.hpp" ! #ifdef _WINDOWS ! #include <windows.h> ! #include <imagehlp.h> ! ! // functions needed for decoding symbols ! typedef DWORD (WINAPI *pfn_SymSetOptions)(DWORD); ! typedef BOOL (WINAPI *pfn_SymInitialize)(HANDLE, PCTSTR, BOOL); ! typedef BOOL (WINAPI *pfn_SymGetSymFromAddr64)(HANDLE, DWORD64, PDWORD64, PIMAGEHLP_SYMBOL64); ! typedef DWORD (WINAPI *pfn_UndecorateSymbolName)(const char*, char*, DWORD, DWORD); ! ! #elif defined(__APPLE__) ! ! #else ! ! class ElfFile; ! ! #endif // _WINDOWS ! ! ! class Decoder: public StackObj { ! ! public: // status code for decoding native C frame enum decoder_status { ! no_error, // successfully decoded frames out_of_memory, // out of memory file_invalid, // invalid elf file file_not_found, // could not found symbol file (on windows), such as jvm.pdb or jvm.map helper_not_found, // could not load dbghelp.dll (Windows only) helper_func_error, // decoding functions not found (Windows only) ! helper_init_error, // SymInitialize failed (Windows only) ! symbol_not_found // could not find the symbol }; ! public: ! Decoder() { initialize(); }; ! ~Decoder() { uninitialize(); }; ! static bool can_decode_C_frame_in_vm(); ! static void initialize(); ! static void uninitialize(); ! #ifdef _WINDOWS ! static decoder_status decode(address addr, char *buf, int buflen, int *offset); ! #else ! static decoder_status decode(address addr, const char* filepath, char *buf, int buflen, int *offset); ! #endif ! static bool demangle(const char* symbol, char *buf, int buflen); ! static decoder_status get_status() { return _decoder_status; }; ! #if !defined(_WINDOWS) && !defined(__APPLE__) ! private: ! static ElfFile* get_elf_file(const char* filepath); ! #endif // _WINDOWS ! private: ! static decoder_status _decoder_status; ! static bool _initialized; ! #ifdef _WINDOWS ! static HMODULE _dbghelp_handle; ! static bool _can_decode_in_vm; ! static pfn_SymGetSymFromAddr64 _pfnSymGetSymFromAddr64; ! static pfn_UndecorateSymbolName _pfnUndecorateSymbolName; ! #elif __APPLE__ ! #else ! static ElfFile* _opened_elf_files; ! #endif // _WINDOWS }; ! #endif // __DECODER_HPP --- 21,100 ---- * questions. * */ ! #ifndef SHARE_VM_UTILITIES_DECODER_HPP ! #define SHARE_VM_UTILITIES_DECODER_HPP #include "memory/allocation.hpp" + #include "runtime/mutex.hpp" ! class NullDecoder: public CHeapObj { ! public: // status code for decoding native C frame enum decoder_status { ! not_available = -10, // real decoder is not available ! no_error = 0, // successfully decoded frames out_of_memory, // out of memory file_invalid, // invalid elf file file_not_found, // could not found symbol file (on windows), such as jvm.pdb or jvm.map helper_not_found, // could not load dbghelp.dll (Windows only) helper_func_error, // decoding functions not found (Windows only) ! helper_init_error // SymInitialize failed (Windows only) }; ! NullDecoder() { ! _decoder_status = not_available; ! } ! ~NullDecoder() {}; ! virtual bool decode(address pc, char* buf, int buflen, int* offset, ! const char* modulepath = NULL) { ! return false; ! } ! virtual bool demangle(const char* symbol, char* buf, int buflen) { ! return false; ! } ! virtual bool can_decode_C_frame_in_vm() const { ! return false; ! } ! virtual decoder_status status() const { ! return _decoder_status; ! } ! virtual bool has_error() const { ! return is_error(_decoder_status); ! } + static bool is_error(decoder_status status) { + return (status > 0); + } ! protected: ! decoder_status _decoder_status; ! }; ! ! class Decoder: AllStatic { ! public: ! static bool decode(address pc, char* buf, int buflen, int* offset, const char* modulepath = NULL); ! static bool demangle(const char* symbol, char* buf, int buflen); ! static bool can_decode_C_frame_in_vm(); ! ! static void shutdown(); ! protected: ! static NullDecoder* get_decoder(); ! ! private: ! static NullDecoder* _decoder; ! static NullDecoder _do_nothing_decoder; ! ! protected: ! static Mutex* _decoder_lock; }; ! #endif // SHARE_VM_UTILITIES_DECODER_HPP