1 // Copyright 2012 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_BASE_LOGGING_H_ 6 #define V8_BASE_LOGGING_H_ 7 8 #include <string.h> 9 10 #include "include/v8stdint.h" 11 #include "src/base/build_config.h" 12 13 extern "C" void V8_Fatal(const char* file, int line, const char* format, ...); 14 15 16 // The FATAL, UNREACHABLE and UNIMPLEMENTED macros are useful during 17 // development, but they should not be relied on in the final product. 18 #ifdef DEBUG 19 #define FATAL(msg) \ 20 V8_Fatal(__FILE__, __LINE__, "%s", (msg)) 21 #define UNIMPLEMENTED() \ 22 V8_Fatal(__FILE__, __LINE__, "unimplemented code") 23 #define UNREACHABLE() \ 24 V8_Fatal(__FILE__, __LINE__, "unreachable code") 25 #else 26 #define FATAL(msg) \ 27 V8_Fatal("", 0, "%s", (msg)) 28 #define UNIMPLEMENTED() \ 29 V8_Fatal("", 0, "unimplemented code") 30 #define UNREACHABLE() ((void) 0) 31 #endif 32 33 34 // The CHECK macro checks that the given condition is true; if not, it 35 // prints a message to stderr and aborts. 36 #define CHECK(condition) do { \ 37 if (!(condition)) { \ 38 V8_Fatal(__FILE__, __LINE__, "CHECK(%s) failed", #condition); \ 39 } \ 40 } while (0) 41 42 43 // Helper function used by the CHECK_EQ function when given int 44 // arguments. Should not be called directly. 45 inline void CheckEqualsHelper(const char* file, int line, 46 const char* expected_source, int expected, 47 const char* value_source, int value) { 48 if (expected != value) { 49 V8_Fatal(file, line, 50 "CHECK_EQ(%s, %s) failed\n# Expected: %i\n# Found: %i", 51 expected_source, value_source, expected, value); 52 } 53 } 54 55 56 // Helper function used by the CHECK_EQ function when given int64_t 57 // arguments. Should not be called directly. 58 inline void CheckEqualsHelper(const char* file, int line, 59 const char* expected_source, 60 int64_t expected, 61 const char* value_source, 62 int64_t value) { 63 if (expected != value) { 64 // Print int64_t values in hex, as two int32s, 65 // to avoid platform-dependencies. 66 V8_Fatal(file, line, 67 "CHECK_EQ(%s, %s) failed\n#" 68 " Expected: 0x%08x%08x\n# Found: 0x%08x%08x", 69 expected_source, value_source, 70 static_cast<uint32_t>(expected >> 32), 71 static_cast<uint32_t>(expected), 72 static_cast<uint32_t>(value >> 32), 73 static_cast<uint32_t>(value)); 74 } 75 } 76 77 78 // Helper function used by the CHECK_NE function when given int 79 // arguments. Should not be called directly. 80 inline void CheckNonEqualsHelper(const char* file, 81 int line, 82 const char* unexpected_source, 83 int unexpected, 84 const char* value_source, 85 int value) { 86 if (unexpected == value) { 87 V8_Fatal(file, line, "CHECK_NE(%s, %s) failed\n# Value: %i", 88 unexpected_source, value_source, value); 89 } 90 } 91 92 93 // Helper function used by the CHECK function when given string 94 // arguments. Should not be called directly. 95 inline void CheckEqualsHelper(const char* file, 96 int line, 97 const char* expected_source, 98 const char* expected, 99 const char* value_source, 100 const char* value) { 101 if ((expected == NULL && value != NULL) || 102 (expected != NULL && value == NULL) || 103 (expected != NULL && value != NULL && strcmp(expected, value) != 0)) { 104 V8_Fatal(file, line, 105 "CHECK_EQ(%s, %s) failed\n# Expected: %s\n# Found: %s", 106 expected_source, value_source, expected, value); 107 } 108 } 109 110 111 inline void CheckNonEqualsHelper(const char* file, 112 int line, 113 const char* expected_source, 114 const char* expected, 115 const char* value_source, 116 const char* value) { 117 if (expected == value || 118 (expected != NULL && value != NULL && strcmp(expected, value) == 0)) { 119 V8_Fatal(file, line, "CHECK_NE(%s, %s) failed\n# Value: %s", 120 expected_source, value_source, value); 121 } 122 } 123 124 125 // Helper function used by the CHECK function when given pointer 126 // arguments. Should not be called directly. 127 inline void CheckEqualsHelper(const char* file, 128 int line, 129 const char* expected_source, 130 const void* expected, 131 const char* value_source, 132 const void* value) { 133 if (expected != value) { 134 V8_Fatal(file, line, 135 "CHECK_EQ(%s, %s) failed\n# Expected: %p\n# Found: %p", 136 expected_source, value_source, 137 expected, value); 138 } 139 } 140 141 142 inline void CheckNonEqualsHelper(const char* file, 143 int line, 144 const char* expected_source, 145 const void* expected, 146 const char* value_source, 147 const void* value) { 148 if (expected == value) { 149 V8_Fatal(file, line, "CHECK_NE(%s, %s) failed\n# Value: %p", 150 expected_source, value_source, value); 151 } 152 } 153 154 155 inline void CheckNonEqualsHelper(const char* file, 156 int line, 157 const char* expected_source, 158 int64_t expected, 159 const char* value_source, 160 int64_t value) { 161 if (expected == value) { 162 V8_Fatal(file, line, 163 "CHECK_EQ(%s, %s) failed\n# Expected: %f\n# Found: %f", 164 expected_source, value_source, expected, value); 165 } 166 } 167 168 169 #define CHECK_EQ(expected, value) CheckEqualsHelper(__FILE__, __LINE__, \ 170 #expected, expected, #value, value) 171 172 173 #define CHECK_NE(unexpected, value) CheckNonEqualsHelper(__FILE__, __LINE__, \ 174 #unexpected, unexpected, #value, value) 175 176 177 #define CHECK_GT(a, b) CHECK((a) > (b)) 178 #define CHECK_GE(a, b) CHECK((a) >= (b)) 179 #define CHECK_LT(a, b) CHECK((a) < (b)) 180 #define CHECK_LE(a, b) CHECK((a) <= (b)) 181 182 183 namespace v8 { 184 namespace base { 185 186 // Exposed for making debugging easier (to see where your function is being 187 // called, just add a call to DumpBacktrace). 188 void DumpBacktrace(); 189 190 } } // namespace v8::base 191 192 193 // The DCHECK macro is equivalent to CHECK except that it only 194 // generates code in debug builds. 195 #ifdef DEBUG 196 #define DCHECK_RESULT(expr) CHECK(expr) 197 #define DCHECK(condition) CHECK(condition) 198 #define DCHECK_EQ(v1, v2) CHECK_EQ(v1, v2) 199 #define DCHECK_NE(v1, v2) CHECK_NE(v1, v2) 200 #define DCHECK_GE(v1, v2) CHECK_GE(v1, v2) 201 #define DCHECK_LT(v1, v2) CHECK_LT(v1, v2) 202 #define DCHECK_LE(v1, v2) CHECK_LE(v1, v2) 203 #else 204 #define DCHECK_RESULT(expr) (expr) 205 #define DCHECK(condition) ((void) 0) 206 #define DCHECK_EQ(v1, v2) ((void) 0) 207 #define DCHECK_NE(v1, v2) ((void) 0) 208 #define DCHECK_GE(v1, v2) ((void) 0) 209 #define DCHECK_LT(v1, v2) ((void) 0) 210 #define DCHECK_LE(v1, v2) ((void) 0) 211 #endif 212 213 #define DCHECK_NOT_NULL(p) DCHECK_NE(NULL, p) 214 215 // "Extra checks" are lightweight checks that are enabled in some release 216 // builds. 217 #ifdef ENABLE_EXTRA_CHECKS 218 #define EXTRA_CHECK(condition) CHECK(condition) 219 #else 220 #define EXTRA_CHECK(condition) ((void) 0) 221 #endif 222 223 #endif // V8_BASE_LOGGING_H_ 224