1 /*
2 * Copyright (c) 1997, 2017, 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 */
24
25 #ifndef SHARE_VM_UTILITIES_DEBUG_HPP
26 #define SHARE_VM_UTILITIES_DEBUG_HPP
27
28 #include "utilities/breakpoint.hpp"
29 #include "utilities/compilerWarnings.hpp"
30 #include "utilities/macros.hpp"
31
32 #include <stddef.h>
33
34 // assertions
35 #ifndef ASSERT
36 #define vmassert(p, ...)
37 #else
38 // Note: message says "assert" rather than "vmassert" for backward
39 // compatibility with tools that parse/match the message text.
40 // Note: The signature is vmassert(p, format, ...), but the solaris
41 // compiler can't handle an empty ellipsis in a macro without a warning.
42 #define vmassert(p, ...) \
43 do { \
44 if (!(p)) { \
45 if (is_executing_unit_tests()) { \
46 report_assert_msg(__VA_ARGS__); \
47 } \
48 report_vm_error(__FILE__, __LINE__, "assert(" #p ") failed", __VA_ARGS__); \
49 BREAKPOINT; \
50 } \
51 } while (0)
52 #endif
53
54 // For backward compatibility.
55 #define assert(p, ...) vmassert(p, __VA_ARGS__)
56
57 #ifndef ASSERT
58 #define vmassert_status(p, status, msg)
59 #else
60 // This version of vmassert is for use with checking return status from
61 // library calls that return actual error values eg. EINVAL,
62 // ENOMEM etc, rather than returning -1 and setting errno.
63 // When the status is not what is expected it is very useful to know
64 // what status was actually returned, so we pass the status variable as
65 // an extra arg and use strerror to convert it to a meaningful string
66 // like "Invalid argument", "out of memory" etc
67 #define vmassert_status(p, status, msg) \
68 do { \
69 if (!(p)) { \
70 report_vm_status_error(__FILE__, __LINE__, "assert(" #p ") failed", \
71 status, msg); \
72 BREAKPOINT; \
73 } \
74 } while (0)
75 #endif
76
77 // For backward compatibility.
78 #define assert_status(p, status, msg) vmassert_status(p, status, msg)
79
80 // guarantee is like vmassert except it's always executed -- use it for
81 // cheap tests that catch errors that would otherwise be hard to find.
82 // guarantee is also used for Verify options.
83 #define guarantee(p, ...) \
84 do { \
85 if (!(p)) { \
86 report_vm_error(__FILE__, __LINE__, "guarantee(" #p ") failed", __VA_ARGS__); \
87 BREAKPOINT; \
88 } \
89 } while (0)
90
91 #define fatal(...) \
92 do { \
93 report_fatal(__FILE__, __LINE__, __VA_ARGS__); \
94 BREAKPOINT; \
95 } while (0)
96
97 // out of memory
98 #define vm_exit_out_of_memory(size, vm_err_type, ...) \
99 do { \
100 report_vm_out_of_memory(__FILE__, __LINE__, size, vm_err_type, __VA_ARGS__); \
101 BREAKPOINT; \
102 } while (0)
103
104 #define ShouldNotCallThis() \
105 do { \
106 report_should_not_call(__FILE__, __LINE__); \
107 BREAKPOINT; \
108 } while (0)
109
110 #define ShouldNotReachHere() \
111 do { \
112 report_should_not_reach_here(__FILE__, __LINE__); \
113 BREAKPOINT; \
114 } while (0)
115
116 #define Unimplemented() \
117 do { \
118 report_unimplemented(__FILE__, __LINE__); \
119 BREAKPOINT; \
120 } while (0)
121
122 #define Untested(msg) \
123 do { \
124 report_untested(__FILE__, __LINE__, msg); \
125 BREAKPOINT; \
126 } while (0);
127
128
129 // types of VM error - originally in vmError.hpp
130 enum VMErrorType {
131 INTERNAL_ERROR = 0xe0000000,
132 OOM_MALLOC_ERROR = 0xe0000001,
133 OOM_MMAP_ERROR = 0xe0000002
134 };
135
136 // error reporting helper functions
137 void report_vm_error(const char* file, int line, const char* error_msg);
|
1 /*
2 * Copyright (c) 1997, 2018, 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 */
24
25 #ifndef SHARE_VM_UTILITIES_DEBUG_HPP
26 #define SHARE_VM_UTILITIES_DEBUG_HPP
27
28 #include "utilities/breakpoint.hpp"
29 #include "utilities/compilerWarnings.hpp"
30 #include "utilities/macros.hpp"
31
32 #include <stddef.h>
33
34 // ShowRegistersOnAssert support (for now Linux only)
35 #if defined(LINUX) && !defined(ZERO)
36 #define CAN_SHOW_REGISTERS_ON_ASSERT
37 extern void* volatile g_assert_poison;
38 #define TOUCH_ASSERT_POISON (*(char*)g_assert_poison = 'X');
39 void initialize_assert_poison();
40 bool handle_assert_poison_fault(const void* ucVoid, const void* faulting_address);
41 #else
42 #define TOUCH_ASSERT_POISON
43 #endif // CAN_SHOW_REGISTERS_ON_ASSERT
44
45 // assertions
46 #ifndef ASSERT
47 #define vmassert(p, ...)
48 #else
49 // Note: message says "assert" rather than "vmassert" for backward
50 // compatibility with tools that parse/match the message text.
51 // Note: The signature is vmassert(p, format, ...), but the solaris
52 // compiler can't handle an empty ellipsis in a macro without a warning.
53 #define vmassert(p, ...) \
54 do { \
55 if (!(p)) { \
56 TOUCH_ASSERT_POISON \
57 if (is_executing_unit_tests()) { \
58 report_assert_msg(__VA_ARGS__); \
59 } \
60 report_vm_error(__FILE__, __LINE__, "assert(" #p ") failed", __VA_ARGS__); \
61 BREAKPOINT; \
62 } \
63 } while (0)
64 #endif
65
66 // For backward compatibility.
67 #define assert(p, ...) vmassert(p, __VA_ARGS__)
68
69 #ifndef ASSERT
70 #define vmassert_status(p, status, msg)
71 #else
72 // This version of vmassert is for use with checking return status from
73 // library calls that return actual error values eg. EINVAL,
74 // ENOMEM etc, rather than returning -1 and setting errno.
75 // When the status is not what is expected it is very useful to know
76 // what status was actually returned, so we pass the status variable as
77 // an extra arg and use strerror to convert it to a meaningful string
78 // like "Invalid argument", "out of memory" etc
79 #define vmassert_status(p, status, msg) \
80 do { \
81 if (!(p)) { \
82 TOUCH_ASSERT_POISON \
83 report_vm_status_error(__FILE__, __LINE__, "assert(" #p ") failed", \
84 status, msg); \
85 BREAKPOINT; \
86 } \
87 } while (0)
88 #endif
89
90 // For backward compatibility.
91 #define assert_status(p, status, msg) vmassert_status(p, status, msg)
92
93 // guarantee is like vmassert except it's always executed -- use it for
94 // cheap tests that catch errors that would otherwise be hard to find.
95 // guarantee is also used for Verify options.
96 #define guarantee(p, ...) \
97 do { \
98 if (!(p)) { \
99 TOUCH_ASSERT_POISON \
100 report_vm_error(__FILE__, __LINE__, "guarantee(" #p ") failed", __VA_ARGS__); \
101 BREAKPOINT; \
102 } \
103 } while (0)
104
105 #define fatal(...) \
106 do { \
107 TOUCH_ASSERT_POISON \
108 report_fatal(__FILE__, __LINE__, __VA_ARGS__); \
109 BREAKPOINT; \
110 } while (0)
111
112 // out of memory
113 #define vm_exit_out_of_memory(size, vm_err_type, ...) \
114 do { \
115 report_vm_out_of_memory(__FILE__, __LINE__, size, vm_err_type, __VA_ARGS__); \
116 BREAKPOINT; \
117 } while (0)
118
119 #define ShouldNotCallThis() \
120 do { \
121 TOUCH_ASSERT_POISON \
122 report_should_not_call(__FILE__, __LINE__); \
123 BREAKPOINT; \
124 } while (0)
125
126 #define ShouldNotReachHere() \
127 do { \
128 TOUCH_ASSERT_POISON \
129 report_should_not_reach_here(__FILE__, __LINE__); \
130 BREAKPOINT; \
131 } while (0)
132
133 #define Unimplemented() \
134 do { \
135 TOUCH_ASSERT_POISON \
136 report_unimplemented(__FILE__, __LINE__); \
137 BREAKPOINT; \
138 } while (0)
139
140 #define Untested(msg) \
141 do { \
142 report_untested(__FILE__, __LINE__, msg); \
143 BREAKPOINT; \
144 } while (0);
145
146
147 // types of VM error - originally in vmError.hpp
148 enum VMErrorType {
149 INTERNAL_ERROR = 0xe0000000,
150 OOM_MALLOC_ERROR = 0xe0000001,
151 OOM_MMAP_ERROR = 0xe0000002
152 };
153
154 // error reporting helper functions
155 void report_vm_error(const char* file, int line, const char* error_msg);
|