[compiler-rt] 11b9ec5 - [sanitizer] Add more internal symbolizer tests
Vitaly Buka via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 22 14:45:10 PDT 2023
Author: Vitaly Buka
Date: 2023-09-22T14:44:57-07:00
New Revision: 11b9ec5f240ebb32013c33b0c2c80cb7f05ba213
URL: https://github.com/llvm/llvm-project/commit/11b9ec5f240ebb32013c33b0c2c80cb7f05ba213
DIFF: https://github.com/llvm/llvm-project/commit/11b9ec5f240ebb32013c33b0c2c80cb7f05ba213.diff
LOG: [sanitizer] Add more internal symbolizer tests
And merge them with demangle_internal.cpp.
Added:
compiler-rt/test/sanitizer_common/TestCases/Linux/internal_symbolizer.cpp
Modified:
Removed:
compiler-rt/test/sanitizer_common/TestCases/demangle_internal.cpp
################################################################################
diff --git a/compiler-rt/test/sanitizer_common/TestCases/Linux/internal_symbolizer.cpp b/compiler-rt/test/sanitizer_common/TestCases/Linux/internal_symbolizer.cpp
new file mode 100644
index 000000000000000..ddfbfdaca8985a4
--- /dev/null
+++ b/compiler-rt/test/sanitizer_common/TestCases/Linux/internal_symbolizer.cpp
@@ -0,0 +1,142 @@
+// RUN: %clangxx %s -o %t && %run %t
+
+// REQUIRES: internal_symbolizer
+
+#include <assert.h>
+#include <dlfcn.h>
+#include <link.h>
+#include <sanitizer/msan_interface.h>
+#include <string.h>
+
+#include <string>
+#include <vector>
+
+extern "C" {
+bool __sanitizer_symbolize_code(const char *ModuleName, uint64_t ModuleOffset,
+ char *Buffer, int MaxLength,
+ bool SymbolizeInlineFrames);
+bool __sanitizer_symbolize_data(const char *ModuleName, uint64_t ModuleOffset,
+ char *Buffer, int MaxLength);
+void __sanitizer_print_stack_trace();
+bool __sanitizer_symbolize_demangle(const char *Name, char *Buffer,
+ int MaxLength);
+}
+
+struct ScopedInSymbolizer {
+#if defined(__has_feature)
+# if __has_feature(memory_sanitizer)
+ ScopedInSymbolizer() { __msan_scoped_disable_interceptor_checks(); }
+ ~ScopedInSymbolizer() { __msan_scoped_enable_interceptor_checks(); }
+# endif
+#endif
+};
+
+struct FrameInfo {
+ int line;
+ std::string file;
+ std::string function;
+ void *address;
+};
+
+__attribute__((noinline)) void *GetPC() { return __builtin_return_address(0); }
+
+__attribute__((always_inline)) FrameInfo InlineFunction() {
+ void *address = GetPC();
+ return {__LINE__ - 1, __FILE__, __FUNCTION__,
+ reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(address) - 1)};
+}
+
+__attribute__((noinline)) FrameInfo NoInlineFunction() {
+ void *address = GetPC();
+ return {__LINE__ - 1, __FILE__, __FUNCTION__,
+ reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(address) - 1)};
+}
+
+template <int N> struct A {
+ template <class T> FrameInfo RecursiveTemplateFunction(const T &t);
+};
+
+template <int N>
+template <class T>
+__attribute__((noinline)) FrameInfo A<N>::RecursiveTemplateFunction(const T &) {
+ std::vector<T> t;
+ return A<N - 1>().RecursiveTemplateFunction(t);
+}
+
+template <>
+template <class T>
+__attribute__((noinline)) FrameInfo A<0>::RecursiveTemplateFunction(const T &) {
+ return NoInlineFunction();
+}
+
+__attribute__((no_sanitize_memory)) std::pair<const char *, uint64_t>
+GetModuleAndOffset(void *address) {
+ Dl_info di;
+ link_map *lm = nullptr;
+ assert(
+ dladdr1(address, &di, reinterpret_cast<void **>(&lm), RTLD_DL_LINKMAP));
+ return {di.dli_fname, reinterpret_cast<uint64_t>(address) - lm->l_addr};
+}
+
+std::string Symbolize(FrameInfo frame) {
+ auto modul_offset = GetModuleAndOffset(frame.address);
+ char buffer[1024] = {};
+ ScopedInSymbolizer in_symbolizer;
+ __sanitizer_symbolize_code(modul_offset.first, modul_offset.second, buffer,
+ std::size(buffer), true);
+ return buffer;
+}
+
+std::string GetRegex(const FrameInfo &frame) {
+ return frame.function + "[^\\n]*\\n[^\\n]*" + frame.file + ":" +
+ std::to_string(frame.line);
+}
+
+void TestInline() {
+ auto frame = InlineFunction();
+ fprintf(stderr, "%s: %s\n", __FUNCTION__, Symbolize(frame).c_str());
+}
+
+void TestNoInline() {
+ auto frame = NoInlineFunction();
+ fprintf(stderr, "%s: %s\n", __FUNCTION__, Symbolize(frame).c_str());
+}
+
+void TestLongFunctionNames() {
+ auto frame = A<10>().RecursiveTemplateFunction(0);
+ fprintf(stderr, "%s: %s\n", __FUNCTION__, Symbolize(frame).c_str());
+}
+
+std::string SymbolizeStaticVar() {
+ static int var = 1;
+ auto modul_offset = GetModuleAndOffset(&var);
+ char buffer[1024] = {};
+ ScopedInSymbolizer in_symbolizer;
+ __sanitizer_symbolize_data(modul_offset.first, modul_offset.second, buffer,
+ std::size(buffer));
+ return buffer;
+}
+
+void TestData() {
+ fprintf(stderr, "%s: %s\n", __FUNCTION__, SymbolizeStaticVar().c_str());
+}
+
+void TestDemangle() {
+ char out[128];
+ assert(!__sanitizer_symbolize_demangle("1A", out, sizeof(out)));
+
+ const char name[] = "_Z3fooi";
+ for (int i = 1; i < sizeof(out); ++i) {
+ memset(out, 1, sizeof(out));
+ assert(__sanitizer_symbolize_demangle(name, out, i) == (i > 8));
+ assert(i < 9 || 0 == strncmp(out, "foo(int)", i - 1));
+ }
+}
+
+int main() {
+ TestInline();
+ TestNoInline();
+ TestLongFunctionNames();
+ TestData();
+ TestDemangle();
+}
diff --git a/compiler-rt/test/sanitizer_common/TestCases/demangle_internal.cpp b/compiler-rt/test/sanitizer_common/TestCases/demangle_internal.cpp
deleted file mode 100644
index 964dcda626c307b..000000000000000
--- a/compiler-rt/test/sanitizer_common/TestCases/demangle_internal.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-// RUN: %clangxx -O0 %s -o %t && %run %t
-
-// REQUIRES: internal_symbolizer
-
-#include <algorithm>
-#include <assert.h>
-#include <string.h>
-
-extern "C" bool __sanitizer_symbolize_demangle(const char *Name, char *Buffer,
- int MaxLength);
-
-int main() {
- char out[128];
- assert(!__sanitizer_symbolize_demangle("1A", out, sizeof(out)));
-
- const char name[] = "_Z3fooi";
- for (int i = 1; i < sizeof(out); ++i) {
- memset(out, 1, sizeof(out));
- assert(__sanitizer_symbolize_demangle(name, out, i) == (i > 8));
- assert(i < 9 || 0 == strncmp(out, "foo(int)", i - 1));
- }
-}
More information about the llvm-commits
mailing list