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

Dimitry Andric via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 28 13:26:00 PDT 2016


Yes, it looks like DemangleCXXABI() unconditionally calls __cxa_demangle(), even if the symbol doesn't start with _Z.  I think there should be a test in DemangleCXXABI() similar to the one in DemangleSwift(), e.g:

  // Check if we are dealing with a C++ mangled name first.
  if (name[0] != '_' || name[1] != 'Z') {
    return nullptr;
  }

-Dimitry

> On 28 Jul 2016, at 22:13, Reid Kleckner via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> 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 <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 <mailto: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 <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 <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 <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 <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 <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 <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 <mailto:llvm-commits at lists.llvm.org>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits>
> 
> _______________________________________________
> 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/f8f8c786/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 194 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160728/f8f8c786/attachment.sig>


More information about the llvm-commits mailing list