[compiler-rt] r268716 - [sanitizer] Fix a crash when demangling Swift symbols
Kuba Brecka via llvm-commits
llvm-commits at lists.llvm.org
Fri May 6 01:54:58 PDT 2016
Author: kuba.brecka
Date: Fri May 6 03:54:58 2016
New Revision: 268716
URL: http://llvm.org/viewvc/llvm-project?rev=268716&view=rev
Log:
[sanitizer] Fix a crash when demangling Swift symbols
To invoke the Swift demangler, we use dlsym to locate swift_demangle. However, dlsym malloc's storage and stores it in thread-local storage. Since allocations from the symbolizer are done with the system allocator (at least in TSan, interceptors are skipped when inside the symbolizer), we will crash when we try to deallocate later using the sanitizer allocator again.
To fix this, let's just not call dlsym from the demangler, and call it during initialization.
Differential Revision: http://reviews.llvm.org/D19974
Modified:
compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
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=268716&r1=268715&r2=268716&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 May 6 03:54:58 2016
@@ -63,6 +63,20 @@ const char *DemangleCXXABI(const char *n
return name;
}
+// 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);
+static swift_demangle_ft swift_demangle_f;
+
+// This must not happen lazily, because dlsym uses thread-local storage, which
+// is not a good thing to do during symbolication.
+static void InitializeSwiftDemangler() {
+ swift_demangle_f = (swift_demangle_ft)dlsym(RTLD_DEFAULT, "swift_demangle");
+}
+
// 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) {
@@ -72,16 +86,6 @@ const char *DemangleSwift(const char *na
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);
@@ -479,6 +483,8 @@ static void ChooseSymbolizerTools(Intrus
}
Symbolizer *Symbolizer::PlatformInit() {
+ InitializeSwiftDemangler();
+
IntrusiveList<SymbolizerTool> list;
list.clear();
ChooseSymbolizerTools(&list, &symbolizer_allocator_);
More information about the llvm-commits
mailing list