[compiler-rt] r281886 - [sanitizer] add __sanitizer_symbolize_data (can only print the names of the globals for now)

Kostya Serebryany via llvm-commits llvm-commits at lists.llvm.org
Sun Sep 18 22:10:33 PDT 2016


Author: kcc
Date: Mon Sep 19 00:10:32 2016
New Revision: 281886

URL: http://llvm.org/viewvc/llvm-project?rev=281886&view=rev
Log:
[sanitizer] add __sanitizer_symbolize_data (can only print the names of the globals for now)

Modified:
    compiler-rt/trunk/include/sanitizer/common_interface_defs.h
    compiler-rt/trunk/lib/asan/asan_win_dll_thunk.cc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace_printer.cc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace_printer.h
    compiler-rt/trunk/test/sanitizer_common/TestCases/symbolize_pc.cc

Modified: compiler-rt/trunk/include/sanitizer/common_interface_defs.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/include/sanitizer/common_interface_defs.h?rev=281886&r1=281885&r2=281886&view=diff
==============================================================================
--- compiler-rt/trunk/include/sanitizer/common_interface_defs.h (original)
+++ compiler-rt/trunk/include/sanitizer/common_interface_defs.h Mon Sep 19 00:10:32 2016
@@ -123,6 +123,9 @@ extern "C" {
   // lib/sanitizer_common/sanitizer_stacktrace_printer.h.
   void __sanitizer_symbolize_pc(void *pc, const char *fmt, char *out_buf,
                                 size_t out_buf_size);
+  // Same as __sanitizer_symbolize_pc, but for data section (i.e. globals).
+  void __sanitizer_symbolize_data(void *data_ptr, const char *fmt,
+                                  char *out_buf, size_t out_buf_size);
 
   // Sets the callback to be called right before death on error.
   // Passing 0 will unset the callback.

Modified: compiler-rt/trunk/lib/asan/asan_win_dll_thunk.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_win_dll_thunk.cc?rev=281886&r1=281885&r2=281886&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_win_dll_thunk.cc (original)
+++ compiler-rt/trunk/lib/asan/asan_win_dll_thunk.cc Mon Sep 19 00:10:32 2016
@@ -335,6 +335,7 @@ INTERFACE_FUNCTION(__sanitizer_get_unmap
 INTERFACE_FUNCTION(__sanitizer_maybe_open_cov_file)
 INTERFACE_FUNCTION(__sanitizer_print_stack_trace)
 INTERFACE_FUNCTION(__sanitizer_symbolize_pc)
+INTERFACE_FUNCTION(__sanitizer_symbolize_data)
 INTERFACE_FUNCTION(__sanitizer_ptr_cmp)
 INTERFACE_FUNCTION(__sanitizer_ptr_sub)
 INTERFACE_FUNCTION(__sanitizer_report_error_summary)

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc?rev=281886&r1=281885&r2=281886&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc Mon Sep 19 00:10:32 2016
@@ -83,14 +83,13 @@ void BufferedStackTrace::Unwind(u32 max_
 }
 
 }  // namespace __sanitizer
+using namespace __sanitizer;
 
 extern "C" {
 SANITIZER_INTERFACE_ATTRIBUTE
-void __sanitizer_symbolize_pc(__sanitizer::uptr pc,
-                              const char *fmt, char *out_buf,
-                              __sanitizer::uptr out_buf_size) {
+void __sanitizer_symbolize_pc(uptr pc, const char *fmt, char *out_buf,
+                              uptr out_buf_size) {
   if (!out_buf_size) return;
-  using namespace __sanitizer;
   pc = StackTrace::GetPreviousInstructionPc(pc);
   SymbolizedStack *frame = Symbolizer::GetOrInit()->SymbolizePC(pc);
   if (!frame) {
@@ -105,4 +104,17 @@ void __sanitizer_symbolize_pc(__sanitize
   internal_strncpy(out_buf, frame_desc.data(), out_buf_size);
   out_buf[out_buf_size - 1] = 0;
 }
+
+SANITIZER_INTERFACE_ATTRIBUTE
+void __sanitizer_symbolize_data(uptr data_addr, const char *fmt, char *out_buf,
+                                uptr out_buf_size) {
+  if (!out_buf_size) return;
+  out_buf[0] = 0;
+  DataInfo DI;
+  if (!Symbolizer::GetOrInit()->SymbolizeData(data_addr, &DI)) return;
+  InternalScopedString data_desc(GetPageSizeCached());
+  RenderData(&data_desc, fmt, &DI, common_flags()->strip_path_prefix);
+  internal_strncpy(out_buf, data_desc.data(), out_buf_size);
+  out_buf[out_buf_size - 1] = 0;
+}
 }  // extern "C"

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace_printer.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace_printer.cc?rev=281886&r1=281885&r2=281886&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace_printer.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace_printer.cc Mon Sep 19 00:10:32 2016
@@ -116,6 +116,35 @@ void RenderFrame(InternalScopedString *b
   }
 }
 
+void RenderData(InternalScopedString *buffer, const char *format,
+                const DataInfo *DI, const char *strip_path_prefix) {
+  for (const char *p = format; *p != '\0'; p++) {
+    if (*p != '%') {
+      buffer->append("%c", *p);
+      continue;
+    }
+    p++;
+    switch (*p) {
+      case '%':
+        buffer->append("%%");
+        break;
+      case 's':
+        buffer->append("%s", StripPathPrefix(DI->file, strip_path_prefix));
+        break;
+      case 'l':
+        buffer->append("%d", DI->line);
+        break;
+      case 'g':
+        buffer->append("%s", DI->name);
+        break;
+      default:
+        Report("Unsupported specifier in stack frame format: %c (0x%zx)!\n", *p,
+               *p);
+        Die();
+    }
+  }
+}
+
 void RenderSourceLocation(InternalScopedString *buffer, const char *file,
                           int line, int column, bool vs_style,
                           const char *strip_path_prefix) {

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace_printer.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace_printer.h?rev=281886&r1=281885&r2=281886&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace_printer.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace_printer.h Mon Sep 19 00:10:32 2016
@@ -59,6 +59,13 @@ void RenderSourceLocation(InternalScoped
 void RenderModuleLocation(InternalScopedString *buffer, const char *module,
                           uptr offset, const char *strip_path_prefix);
 
+// Same as RenderFrame, but for data section (global variables).
+// Accepts %s, %l from above.
+// Also accepts:
+//   %g - name of the global variable.
+void RenderData(InternalScopedString *buffer, const char *format,
+                const DataInfo *DI, const char *strip_path_prefix = "");
+
 }  // namespace __sanitizer
 
 #endif  // SANITIZER_STACKTRACE_PRINTER_H

Modified: compiler-rt/trunk/test/sanitizer_common/TestCases/symbolize_pc.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/sanitizer_common/TestCases/symbolize_pc.cc?rev=281886&r1=281885&r2=281886&view=diff
==============================================================================
--- compiler-rt/trunk/test/sanitizer_common/TestCases/symbolize_pc.cc (original)
+++ compiler-rt/trunk/test/sanitizer_common/TestCases/symbolize_pc.cc Mon Sep 19 00:10:32 2016
@@ -5,6 +5,9 @@
 // Tests __sanitizer_symbolize_pc.
 #include <stdio.h>
 #include <sanitizer/common_interface_defs.h>
+
+int GLOBAL_VAR_ABC;
+
 void SymbolizeCaller() {
   char data[100];
   __sanitizer_symbolize_pc(__builtin_return_address(0), "%p %F %L", data,
@@ -23,8 +26,16 @@ void SymbolizeCaller() {
   printf("LONG_FORMAT %s\n", data);
 }
 
+void SymbolizeData() {
+  char data[100];
+  __sanitizer_symbolize_data(&GLOBAL_VAR_ABC, "%g %s:%l", data, sizeof(data));
+  printf("GLOBAL: %s\n", data);
+}
+
 // CHECK: FIRST_FORMAT 0x{{.*}} in main symbolize_pc.cc:[[@LINE+3]]
 // CHECK: SECOND_FORMAT FUNC:main LINE:[[@LINE+2]] FILE:symbolize_pc.cc
 int main() {
   SymbolizeCaller();
+  SymbolizeData();
 }
+// CHECK: GLOBAL: GLOBAL_VAR_ABC




More information about the llvm-commits mailing list