annotate libsanitizer/sanitizer_common/sanitizer_stacktrace_printer.cpp @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 //===-- sanitizer_common.cpp ----------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 // This file is shared between sanitizers' run-time libraries.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 #include "sanitizer_stacktrace_printer.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 #include "sanitizer_file.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 #include "sanitizer_fuchsia.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 namespace __sanitizer {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 // sanitizer_symbolizer_markup.cpp implements these differently.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 #if !SANITIZER_SYMBOLIZER_MARKUP
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 static const char *StripFunctionName(const char *function, const char *prefix) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 if (!function) return nullptr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 if (!prefix) return function;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 uptr prefix_len = internal_strlen(prefix);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 if (0 == internal_strncmp(function, prefix, prefix_len))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 return function + prefix_len;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 return function;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 static const char *DemangleFunctionName(const char *function) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 if (!function) return nullptr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 // NetBSD uses indirection for old threading functions for historical reasons
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 // The mangled names are internal implementation detail and should not be
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 // exposed even in backtraces.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 #if SANITIZER_NETBSD
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 if (!internal_strcmp(function, "__libc_mutex_init"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 return "pthread_mutex_init";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 if (!internal_strcmp(function, "__libc_mutex_lock"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 return "pthread_mutex_lock";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 if (!internal_strcmp(function, "__libc_mutex_trylock"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 return "pthread_mutex_trylock";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 if (!internal_strcmp(function, "__libc_mutex_unlock"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 return "pthread_mutex_unlock";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 if (!internal_strcmp(function, "__libc_mutex_destroy"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 return "pthread_mutex_destroy";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 if (!internal_strcmp(function, "__libc_mutexattr_init"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 return "pthread_mutexattr_init";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 if (!internal_strcmp(function, "__libc_mutexattr_settype"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 return "pthread_mutexattr_settype";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 if (!internal_strcmp(function, "__libc_mutexattr_destroy"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 return "pthread_mutexattr_destroy";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 if (!internal_strcmp(function, "__libc_cond_init"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 return "pthread_cond_init";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 if (!internal_strcmp(function, "__libc_cond_signal"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 return "pthread_cond_signal";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 if (!internal_strcmp(function, "__libc_cond_broadcast"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 return "pthread_cond_broadcast";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 if (!internal_strcmp(function, "__libc_cond_wait"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 return "pthread_cond_wait";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 if (!internal_strcmp(function, "__libc_cond_timedwait"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 return "pthread_cond_timedwait";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 if (!internal_strcmp(function, "__libc_cond_destroy"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 return "pthread_cond_destroy";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 if (!internal_strcmp(function, "__libc_rwlock_init"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 return "pthread_rwlock_init";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 if (!internal_strcmp(function, "__libc_rwlock_rdlock"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 return "pthread_rwlock_rdlock";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 if (!internal_strcmp(function, "__libc_rwlock_wrlock"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 return "pthread_rwlock_wrlock";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 if (!internal_strcmp(function, "__libc_rwlock_tryrdlock"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 return "pthread_rwlock_tryrdlock";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 if (!internal_strcmp(function, "__libc_rwlock_trywrlock"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 return "pthread_rwlock_trywrlock";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 if (!internal_strcmp(function, "__libc_rwlock_unlock"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 return "pthread_rwlock_unlock";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 if (!internal_strcmp(function, "__libc_rwlock_destroy"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 return "pthread_rwlock_destroy";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 if (!internal_strcmp(function, "__libc_thr_keycreate"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 return "pthread_key_create";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 if (!internal_strcmp(function, "__libc_thr_setspecific"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 return "pthread_setspecific";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 if (!internal_strcmp(function, "__libc_thr_getspecific"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 return "pthread_getspecific";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 if (!internal_strcmp(function, "__libc_thr_keydelete"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 return "pthread_key_delete";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 if (!internal_strcmp(function, "__libc_thr_once"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 return "pthread_once";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 if (!internal_strcmp(function, "__libc_thr_self"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 return "pthread_self";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 if (!internal_strcmp(function, "__libc_thr_exit"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 return "pthread_exit";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 if (!internal_strcmp(function, "__libc_thr_setcancelstate"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 return "pthread_setcancelstate";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 if (!internal_strcmp(function, "__libc_thr_equal"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 return "pthread_equal";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 if (!internal_strcmp(function, "__libc_thr_curcpu"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 return "pthread_curcpu_np";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 if (!internal_strcmp(function, "__libc_thr_sigsetmask"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 return "pthread_sigmask";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 return function;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 static const char kDefaultFormat[] = " #%n %p %F %L";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 void RenderFrame(InternalScopedString *buffer, const char *format, int frame_no,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 const AddressInfo &info, bool vs_style,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 const char *strip_path_prefix, const char *strip_func_prefix) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 if (0 == internal_strcmp(format, "DEFAULT"))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 format = kDefaultFormat;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 for (const char *p = format; *p != '\0'; p++) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 if (*p != '%') {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 buffer->append("%c", *p);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 p++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 switch (*p) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 case '%':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 buffer->append("%%");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 // Frame number and all fields of AddressInfo structure.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 case 'n':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 buffer->append("%zu", frame_no);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 case 'p':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 buffer->append("0x%zx", info.address);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 case 'm':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 buffer->append("%s", StripPathPrefix(info.module, strip_path_prefix));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 case 'o':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 buffer->append("0x%zx", info.module_offset);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 case 'f':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 buffer->append("%s",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 DemangleFunctionName(
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 StripFunctionName(info.function, strip_func_prefix)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 case 'q':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 buffer->append("0x%zx", info.function_offset != AddressInfo::kUnknown
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 ? info.function_offset
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 : 0x0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 case 's':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 buffer->append("%s", StripPathPrefix(info.file, strip_path_prefix));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 case 'l':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 buffer->append("%d", info.line);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 case 'c':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 buffer->append("%d", info.column);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 // Smarter special cases.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 case 'F':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 // Function name and offset, if file is unknown.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 if (info.function) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 buffer->append("in %s",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 DemangleFunctionName(
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 StripFunctionName(info.function, strip_func_prefix)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 if (!info.file && info.function_offset != AddressInfo::kUnknown)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 buffer->append("+0x%zx", info.function_offset);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 case 'S':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 // File/line information.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 RenderSourceLocation(buffer, info.file, info.line, info.column, vs_style,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 strip_path_prefix);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 case 'L':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 // Source location, or module location.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 if (info.file) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 RenderSourceLocation(buffer, info.file, info.line, info.column,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176 vs_style, strip_path_prefix);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 } else if (info.module) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 RenderModuleLocation(buffer, info.module, info.module_offset,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 info.module_arch, strip_path_prefix);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 } else {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 buffer->append("(<unknown module>)");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 case 'M':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 // Module basename and offset, or PC.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186 if (info.address & kExternalPCBit)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 {} // There PCs are not meaningful.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 else if (info.module)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 // Always strip the module name for %M.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 RenderModuleLocation(buffer, StripModuleName(info.module),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 info.module_offset, info.module_arch, "");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 buffer->append("(%p)", (void *)info.address);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 default:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 Report("Unsupported specifier in stack frame format: %c (0x%zx)!\n", *p,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 *p);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 Die();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203 void RenderData(InternalScopedString *buffer, const char *format,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 const DataInfo *DI, const char *strip_path_prefix) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 for (const char *p = format; *p != '\0'; p++) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 if (*p != '%') {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 buffer->append("%c", *p);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210 p++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 switch (*p) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212 case '%':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 buffer->append("%%");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 case 's':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216 buffer->append("%s", StripPathPrefix(DI->file, strip_path_prefix));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 case 'l':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219 buffer->append("%d", DI->line);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 case 'g':
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 buffer->append("%s", DI->name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 default:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 Report("Unsupported specifier in stack frame format: %c (0x%zx)!\n", *p,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 *p);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 Die();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 #endif // !SANITIZER_SYMBOLIZER_MARKUP
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 void RenderSourceLocation(InternalScopedString *buffer, const char *file,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 int line, int column, bool vs_style,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236 const char *strip_path_prefix) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 if (vs_style && line > 0) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 buffer->append("%s(%d", StripPathPrefix(file, strip_path_prefix), line);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239 if (column > 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 buffer->append(",%d", column);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 buffer->append(")");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245 buffer->append("%s", StripPathPrefix(file, strip_path_prefix));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 if (line > 0) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 buffer->append(":%d", line);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248 if (column > 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249 buffer->append(":%d", column);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253 void RenderModuleLocation(InternalScopedString *buffer, const char *module,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 uptr offset, ModuleArch arch,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255 const char *strip_path_prefix) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 buffer->append("(%s", StripPathPrefix(module, strip_path_prefix));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 if (arch != kModuleArchUnknown) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258 buffer->append(":%s", ModuleArchToString(arch));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 buffer->append("+0x%zx)", offset);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263 } // namespace __sanitizer