annotate src/share/vm/utilities/decoder.hpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents 55fb97c4c58d
children 4ca6dc0799b6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
1 /*
17467
55fb97c4c58d 8029233: Update copyright year to match last edit in jdk8 hotspot repository for 2013
mikael
parents: 12199
diff changeset
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
4 *
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
7 * published by the Free Software Foundation.
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
8 *
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
13 * accompanied this code).
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
14 *
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
18 *
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
21 * questions.
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
22 *
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
23 */
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
24
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
25
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
26 #ifndef SHARE_VM_UTILITIES_DECODER_HPP
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
27 #define SHARE_VM_UTILITIES_DECODER_HPP
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
28
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
29 #include "memory/allocation.hpp"
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
30 #include "runtime/mutex.hpp"
12199
38f750491293 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 6258
diff changeset
31 #include "runtime/mutexLocker.hpp"
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
32
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4917
diff changeset
33 class AbstractDecoder : public CHeapObj<mtInternal> {
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
34 public:
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
35 // status code for decoding native C frame
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
36 enum decoder_status {
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
37 not_available = -10, // real decoder is not available
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
38 no_error = 0, // successfully decoded frames
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
39 out_of_memory, // out of memory
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
40 file_invalid, // invalid elf file
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
41 file_not_found, // could not found symbol file (on windows), such as jvm.pdb or jvm.map
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
42 helper_not_found, // could not load dbghelp.dll (Windows only)
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
43 helper_func_error, // decoding functions not found (Windows only)
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
44 helper_init_error // SymInitialize failed (Windows only)
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
45 };
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
46
4917
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
47 // decode an pc address to corresponding function name and an offset from the beginning of
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
48 // the function
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
49 virtual bool decode(address pc, char* buf, int buflen, int* offset,
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
50 const char* modulepath = NULL) = 0;
6258
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6197
diff changeset
51 virtual bool decode(address pc, char* buf, int buflen, int* offset, const void* base) = 0;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6197
diff changeset
52
4917
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
53 // demangle a C++ symbol
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
54 virtual bool demangle(const char* symbol, char* buf, int buflen) = 0;
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
55 // if the decoder can decode symbols in vm
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
56 virtual bool can_decode_C_frame_in_vm() const = 0;
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
57
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
58 virtual decoder_status status() const {
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
59 return _decoder_status;
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
60 }
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
61
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
62 virtual bool has_error() const {
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
63 return is_error(_decoder_status);
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
64 }
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
65
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
66 static bool is_error(decoder_status status) {
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
67 return (status > 0);
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
68 }
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
69
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
70 protected:
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
71 decoder_status _decoder_status;
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
72 };
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
73
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
74 // Do nothing decoder
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
75 class NullDecoder : public AbstractDecoder {
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
76 public:
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
77 NullDecoder() {
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
78 _decoder_status = not_available;
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
79 }
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
80
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
81 ~NullDecoder() {};
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
82
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
83 virtual bool decode(address pc, char* buf, int buflen, int* offset,
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
84 const char* modulepath = NULL) {
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
85 return false;
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
86 }
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
87
6258
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6197
diff changeset
88 virtual bool decode(address pc, char* buf, int buflen, int* offset, const void* base) {
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6197
diff changeset
89 return false;
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6197
diff changeset
90 }
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6197
diff changeset
91
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
92 virtual bool demangle(const char* symbol, char* buf, int buflen) {
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
93 return false;
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
94 }
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
95
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
96 virtual bool can_decode_C_frame_in_vm() const {
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
97 return false;
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
98 }
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
99 };
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
100
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
101
4917
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
102 class Decoder : AllStatic {
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
103 public:
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
104 static bool decode(address pc, char* buf, int buflen, int* offset, const char* modulepath = NULL);
6258
3b01d0321dfa 7186778: MachO decoder implementation for MacOSX
zgu
parents: 6197
diff changeset
105 static bool decode(address pc, char* buf, int buflen, int* offset, const void* base);
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
106 static bool demangle(const char* symbol, char* buf, int buflen);
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
107 static bool can_decode_C_frame_in_vm();
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
108
4917
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
109 // shutdown shared instance
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
110 static void shutdown();
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
111 protected:
4917
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
112 // shared decoder instance, _shared_instance_lock is needed
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
113 static AbstractDecoder* get_shared_instance();
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
114 // a private instance for error handler. Error handler can be
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
115 // triggered almost everywhere, including signal handler, where
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
116 // no lock can be taken. So the shared decoder can not be used
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
117 // in this scenario.
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
118 static AbstractDecoder* get_error_handler_instance();
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
119
4917
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
120 static AbstractDecoder* create_decoder();
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
121 private:
4917
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
122 static AbstractDecoder* _shared_decoder;
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
123 static AbstractDecoder* _error_handler_decoder;
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
124 static NullDecoder _do_nothing_decoder;
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
125
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
126 protected:
4917
db006a85bf91 7141259: Native stack is missing in hs_err
zgu
parents: 4803
diff changeset
127 static Mutex* _shared_decoder_lock;
12199
38f750491293 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 6258
diff changeset
128 static Mutex* shared_decoder_lock();
38f750491293 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 6258
diff changeset
129
38f750491293 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 6258
diff changeset
130 friend class DecoderLocker;
38f750491293 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 6258
diff changeset
131 };
38f750491293 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 6258
diff changeset
132
38f750491293 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 6258
diff changeset
133 class DecoderLocker : public MutexLockerEx {
38f750491293 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 6258
diff changeset
134 AbstractDecoder* _decoder;
38f750491293 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 6258
diff changeset
135 inline bool is_first_error_thread();
38f750491293 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 6258
diff changeset
136 public:
38f750491293 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 6258
diff changeset
137 DecoderLocker();
38f750491293 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 6258
diff changeset
138 AbstractDecoder* decoder() {
38f750491293 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 6258
diff changeset
139 return _decoder;
38f750491293 8022335: Native stack walk while generating hs_err does not work on Windows x64
iklam
parents: 6258
diff changeset
140 }
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
141 };
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
142
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
143 #endif // SHARE_VM_UTILITIES_DECODER_HPP