blob: 3bbffa53f21ca7ddc0309fb8f0ed98a4a0d22ea9 [file] [log] [blame]
Jim Cownie5e8470a2013-09-27 10:38:44 +00001/*
2 * kmp_debug.c -- debug utilities for the Guide library
Jim Cownie5e8470a2013-09-27 10:38:44 +00003 */
4
5
6//===----------------------------------------------------------------------===//
7//
8// The LLVM Compiler Infrastructure
9//
10// This file is dual licensed under the MIT and the University of Illinois Open
11// Source Licenses. See LICENSE.txt for details.
12//
13//===----------------------------------------------------------------------===//
14
15
16#include "kmp.h"
17#include "kmp_debug.h" /* really necessary? */
18#include "kmp_i18n.h"
19#include "kmp_io.h"
20
21#ifdef KMP_DEBUG
22void
23__kmp_debug_printf_stdout( char const * format, ... )
24{
25 va_list ap;
26 va_start( ap, format );
27
28 __kmp_vprintf( kmp_out, format, ap );
29
30 va_end(ap);
31}
32#endif
33
34void
35__kmp_debug_printf( char const * format, ... )
36{
37 va_list ap;
38 va_start( ap, format );
39
40 __kmp_vprintf( kmp_err, format, ap );
41
42 va_end( ap );
43}
44
45#ifdef KMP_USE_ASSERT
46 int
47 __kmp_debug_assert(
48 char const * msg,
49 char const * file,
50 int line
51 ) {
52
53 if ( file == NULL ) {
54 file = KMP_I18N_STR( UnknownFile );
55 } else {
56 // Remove directories from path, leave only file name. File name is enough, there is no need
57 // in bothering developers and customers with full paths.
58 char const * slash = strrchr( file, '/' );
59 if ( slash != NULL ) {
60 file = slash + 1;
61 }; // if
62 }; // if
63
64 #ifdef KMP_DEBUG
65 __kmp_acquire_bootstrap_lock( & __kmp_stdio_lock );
66 __kmp_debug_printf( "Assertion failure at %s(%d): %s.\n", file, line, msg );
67 __kmp_release_bootstrap_lock( & __kmp_stdio_lock );
68 #ifdef USE_ASSERT_BREAK
69 #if KMP_OS_WINDOWS
70 DebugBreak();
71 #endif
72 #endif // USE_ASSERT_BREAK
73 #ifdef USE_ASSERT_STALL
74 /* __kmp_infinite_loop(); */
75 for(;;);
76 #endif // USE_ASSERT_STALL
77 #ifdef USE_ASSERT_SEG
78 {
79 int volatile * ZERO = (int*) 0;
80 ++ (*ZERO);
81 }
82 #endif // USE_ASSERT_SEG
83 #endif
84
85 __kmp_msg(
86 kmp_ms_fatal,
87 KMP_MSG( AssertionFailure, file, line ),
88 KMP_HNT( SubmitBugReport ),
89 __kmp_msg_null
90 );
91
92 return 0;
93
94 } // __kmp_debug_assert
95
96#endif // KMP_USE_ASSERT
97
98/* Dump debugging buffer to stderr */
99void
100__kmp_dump_debug_buffer( void )
101{
102 if ( __kmp_debug_buffer != NULL ) {
103 int i;
104 int dc = __kmp_debug_count;
105 char *db = & __kmp_debug_buffer[ (dc % __kmp_debug_buf_lines) * __kmp_debug_buf_chars ];
106 char *db_end = & __kmp_debug_buffer[ __kmp_debug_buf_lines * __kmp_debug_buf_chars ];
107 char *db2;
108
109 __kmp_acquire_bootstrap_lock( & __kmp_stdio_lock );
110 __kmp_printf_no_lock( "\nStart dump of debugging buffer (entry=%d):\n",
111 dc % __kmp_debug_buf_lines );
112
113 for ( i = 0; i < __kmp_debug_buf_lines; i++ ) {
114
115 if ( *db != '\0' ) {
116 /* Fix up where no carriage return before string termination char */
117 for ( db2 = db + 1; db2 < db + __kmp_debug_buf_chars - 1; db2 ++) {
118 if ( *db2 == '\0' ) {
119 if ( *(db2-1) != '\n' ) { *db2 = '\n'; *(db2+1) = '\0'; }
120 break;
121 }
122 }
123 /* Handle case at end by shortening the printed message by one char if necessary */
124 if ( db2 == db + __kmp_debug_buf_chars - 1 &&
125 *db2 == '\0' && *(db2-1) != '\n' ) {
126 *(db2-1) = '\n';
127 }
128
129 __kmp_printf_no_lock( "%4d: %.*s", i, __kmp_debug_buf_chars, db );
130 *db = '\0'; /* only let it print once! */
131 }
132
133 db += __kmp_debug_buf_chars;
134 if ( db >= db_end )
135 db = __kmp_debug_buffer;
136 }
137
138 __kmp_printf_no_lock( "End dump of debugging buffer (entry=%d).\n\n",
139 ( dc+i-1 ) % __kmp_debug_buf_lines );
140 __kmp_release_bootstrap_lock( & __kmp_stdio_lock );
141 }
142}