LLVM OpenMP* Runtime Library
kmp_debug.c
1 /*
2  * kmp_debug.c -- debug utilities for the Guide library
3  */
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
22 void
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 
34 void
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 */
99 void
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 }