[compiler-rt] r266494 - [sanitizers] Teach the internal demangler about Swift names

Reid Kleckner via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 28 13:13:52 PDT 2016


This test is failing on FreeBSD, it appears because __cxa_demangle consumes
the leading 'f' of foo and returns "float":
http://lab.llvm.org:8011/builders/sanitizer_x86_64-freebsd/builds/12709/steps/test%20sanitizer/logs/stdio

FAIL: SanitizerCommon-Unit ::
Sanitizer-x86_64-Test/Symbolizer.DemangleSwiftAndCXX (292 of 309)
******************** TEST 'SanitizerCommon-Unit ::
Sanitizer-x86_64-Test/Symbolizer.DemangleSwiftAndCXX' FAILED
********************
Note: Google Test filter = Symbolizer.DemangleSwiftAndCXX
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from Symbolizer
[ RUN      ] Symbolizer.DemangleSwiftAndCXX
/usr/home/buildslave/slave_as-bldslv5/sanitizer_x86_64-freebsd/llvm.src/projects/compiler-rt/lib/sanitizer_common/tests/sanitizer_symbolizer_test.cc:65:
Failure
Value of: DemangleSwiftAndCXX("foo")
  Actual: "float"
Expected: "foo"
[  FAILED  ] Symbolizer.DemangleSwiftAndCXX (3 ms)
[----------] 1 test from Symbolizer (3 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (7 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] Symbolizer.DemangleSwiftAndCXX

 1 FAILED TEST


On Fri, Apr 15, 2016 at 4:51 PM, Anna Zaks via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: zaks
> Date: Fri Apr 15 18:51:00 2016
> New Revision: 266494
>
> URL: http://llvm.org/viewvc/llvm-project?rev=266494&view=rev
> Log:
> [sanitizers] Teach the internal demangler about Swift names
>
> Add support for Swift names when symbolicating sanitizer traces. This is
> now relevant since TSan and ASan support have been added to Swift on OS X.
>
> Differential Revision: http://reviews.llvm.org/D19135
>
> Modified:
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_internal.h
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_mac.cc
>
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
>
> compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_symbolizer_test.cc
>
> Modified:
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_internal.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_internal.h?rev=266494&r1=266493&r2=266494&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_internal.h
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_internal.h
> Fri Apr 15 18:51:00 2016
> @@ -28,7 +28,7 @@ const char *ExtractUptr(const char *str,
>  const char *ExtractTokenUpToDelimiter(const char *str, const char
> *delimiter,
>                                        char **result);
>
> -const char *DemangleCXXABI(const char *name);
> +const char *DemangleSwiftAndCXX(const char *name);
>
>  // SymbolizerTool is an interface that is implemented by individual
> "tools"
>  // that can perform symbolication (external llvm-symbolizer, libbacktrace,
>
> Modified:
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_mac.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_mac.cc?rev=266494&r1=266493&r2=266494&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_mac.cc
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_mac.cc Fri
> Apr 15 18:51:00 2016
> @@ -32,7 +32,7 @@ bool DlAddrSymbolizer::SymbolizePC(uptr
>    Dl_info info;
>    int result = dladdr((const void *)addr, &info);
>    if (!result) return false;
> -  const char *demangled = DemangleCXXABI(info.dli_sname);
> +  const char *demangled = DemangleSwiftAndCXX(info.dli_sname);
>    stack->info.function = demangled ? internal_strdup(demangled) : nullptr;
>    return true;
>  }
> @@ -41,7 +41,7 @@ bool DlAddrSymbolizer::SymbolizeData(upt
>    Dl_info info;
>    int result = dladdr((const void *)addr, &info);
>    if (!result) return false;
> -  const char *demangled = DemangleCXXABI(info.dli_sname);
> +  const char *demangled = DemangleSwiftAndCXX(info.dli_sname);
>    datainfo->name = internal_strdup(demangled);
>    datainfo->start = (uptr)info.dli_saddr;
>    return true;
>
> Modified:
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc?rev=266494&r1=266493&r2=266494&view=diff
>
> ==============================================================================
> ---
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
> (original)
> +++
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
> Fri Apr 15 18:51:00 2016
> @@ -26,6 +26,7 @@
>  #include "sanitizer_symbolizer_libbacktrace.h"
>  #include "sanitizer_symbolizer_mac.h"
>
> +#include <dlfcn.h>   // for dlsym()
>  #include <errno.h>
>  #include <stdlib.h>
>  #include <sys/wait.h>
> @@ -61,6 +62,38 @@ const char *DemangleCXXABI(const char *n
>    return name;
>  }
>
> +// Attempts to demangle a Swift name. The demangler will return nullptr
> +/// if a non-Swift name is passed in.
> +const char *DemangleSwift(const char *name) {
> +  // Not to call dlsym every time we demangle, check if we are dealing
> with
> +  // Swift mangled name first.
> +  if (name[0] != '_' || name[1] != 'T') {
> +    return nullptr;
> +  }
> +
> +  // As of now, there are no headers for the Swift runtime. Once they are
> +  // present, we will weakly link since we do not require Swift runtime
> to be
> +  // linked.
> +  typedef char *(*swift_demangle_ft)(const char *mangledName,
> +                                     size_t mangledNameLength,
> +                                     char *outputBuffer,
> +                                     size_t *outputBufferSize,
> +                                     uint32_t flags);
> +  swift_demangle_ft swift_demangle_f =
> +    (swift_demangle_ft) dlsym(RTLD_DEFAULT, "swift_demangle");
> +  if (swift_demangle_f)
> +    return swift_demangle_f(name, internal_strlen(name), 0, 0, 0);
> +
> +  return nullptr;
> +}
> +
> +const char *DemangleSwiftAndCXX(const char *name) {
> +  CHECK(name);
> +  if (const char *swift_demangled_name = DemangleSwift(name))
> +    return swift_demangled_name;
> +  return DemangleCXXABI(name);
> +}
> +
>  bool SymbolizerProcess::StartSymbolizerSubprocess() {
>    if (!FileExists(path_)) {
>      if (!reported_invalid_path_) {
> @@ -364,7 +397,7 @@ class InternalSymbolizer : public Symbol
>  #endif  // SANITIZER_SUPPORTS_WEAK_HOOKS
>
>  const char *Symbolizer::PlatformDemangle(const char *name) {
> -  return DemangleCXXABI(name);
> +  return DemangleSwiftAndCXX(name);
>  }
>
>  void Symbolizer::PlatformPrepareForSandboxing() {}
>
> Modified:
> compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_symbolizer_test.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_symbolizer_test.cc?rev=266494&r1=266493&r2=266494&view=diff
>
> ==============================================================================
> ---
> compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_symbolizer_test.cc
> (original)
> +++
> compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_symbolizer_test.cc
> Fri Apr 15 18:51:00 2016
> @@ -55,4 +55,14 @@ TEST(Symbolizer, ExtractTokenUpToDelimit
>    InternalFree(token);
>  }
>
> +TEST(Symbolizer, DemangleSwiftAndCXX) {
> +  // Swift names are not demangled in default llvm build because Swift
> +  // runtime is not linked in.
> +  EXPECT_STREQ("_TtSd", DemangleSwiftAndCXX("_TtSd"));
> +  // Check that the rest demangles properly.
> +  EXPECT_STREQ("f1(char*, int)", DemangleSwiftAndCXX("_Z2f1Pci"));
> +  EXPECT_STREQ("foo", DemangleSwiftAndCXX("foo"));
> +  EXPECT_STREQ("", DemangleSwiftAndCXX(""));
> +}
> +
>  }  // namespace __sanitizer
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160728/e15662a6/attachment.html>


More information about the llvm-commits mailing list