[Sanitizer] Merge POSIXSymbolizer and WinSymbolizer

The two subclasses of Symbolizer now only define two virtual functions, PlatformDemangle and PlatformPrepareForSandboxing. Let's make these non-virtual and directly defined by individual platforms.

Reviewed at http://reviews.llvm.org/D8912

llvm-svn: 234690
This commit is contained in:
Kuba Brecka 2015-04-11 17:16:25 +00:00
parent 8017237277
commit 93c6a668fc
3 changed files with 18 additions and 29 deletions

View File

@ -75,7 +75,7 @@ struct DataInfo {
class SymbolizerTool; class SymbolizerTool;
class Symbolizer { class Symbolizer final {
public: public:
/// Initialize and return platform-specific implementation of symbolizer /// Initialize and return platform-specific implementation of symbolizer
/// (if it wasn't already initialized). /// (if it wasn't already initialized).
@ -146,8 +146,8 @@ class Symbolizer {
bool modules_fresh_; bool modules_fresh_;
// Platform-specific default demangler, must not return nullptr. // Platform-specific default demangler, must not return nullptr.
virtual const char *PlatformDemangle(const char *name) { UNIMPLEMENTED(); } const char *PlatformDemangle(const char *name);
virtual void PlatformPrepareForSandboxing() { UNIMPLEMENTED(); } void PlatformPrepareForSandboxing();
static Symbolizer *symbolizer_; static Symbolizer *symbolizer_;
static StaticSpinMutex init_mu_; static StaticSpinMutex init_mu_;
@ -160,7 +160,6 @@ class Symbolizer {
typedef IntrusiveList<SymbolizerTool>::Iterator Iterator; typedef IntrusiveList<SymbolizerTool>::Iterator Iterator;
IntrusiveList<SymbolizerTool> tools_; IntrusiveList<SymbolizerTool> tools_;
protected:
explicit Symbolizer(IntrusiveList<SymbolizerTool> tools); explicit Symbolizer(IntrusiveList<SymbolizerTool> tools);
static LowLevelAllocator symbolizer_allocator_; static LowLevelAllocator symbolizer_allocator_;

View File

@ -349,23 +349,16 @@ class InternalSymbolizer : public SymbolizerTool {
#endif // SANITIZER_SUPPORTS_WEAK_HOOKS #endif // SANITIZER_SUPPORTS_WEAK_HOOKS
class POSIXSymbolizer : public Symbolizer { const char *Symbolizer::PlatformDemangle(const char *name) {
public: return DemangleCXXABI(name);
explicit POSIXSymbolizer(IntrusiveList<SymbolizerTool> tools) }
: Symbolizer(tools) {}
private: void Symbolizer::PlatformPrepareForSandboxing() {
const char *PlatformDemangle(const char *name) override {
return DemangleCXXABI(name);
}
void PlatformPrepareForSandboxing() override {
#if SANITIZER_LINUX && !SANITIZER_ANDROID #if SANITIZER_LINUX && !SANITIZER_ANDROID
// Cache /proc/self/exe on Linux. // Cache /proc/self/exe on Linux.
CacheBinaryName(); CacheBinaryName();
#endif #endif
} }
};
static SymbolizerTool *ChooseExternalSymbolizer(LowLevelAllocator *allocator) { static SymbolizerTool *ChooseExternalSymbolizer(LowLevelAllocator *allocator) {
const char *path = common_flags()->external_symbolizer_path; const char *path = common_flags()->external_symbolizer_path;
@ -448,7 +441,7 @@ Symbolizer *Symbolizer::PlatformInit() {
IntrusiveList<SymbolizerTool> list; IntrusiveList<SymbolizerTool> list;
list.clear(); list.clear();
ChooseSymbolizerTools(&list, &symbolizer_allocator_); ChooseSymbolizerTools(&list, &symbolizer_allocator_);
return new(symbolizer_allocator_) POSIXSymbolizer(list); return new(symbolizer_allocator_) Symbolizer(list);
} }
} // namespace __sanitizer } // namespace __sanitizer

View File

@ -129,22 +129,19 @@ const char *WinSymbolizerTool::Demangle(const char *name) {
return name; return name;
} }
// TODO(kuba.brecka): To be merged with POSIXSymbolizer. const char *Symbolizer::PlatformDemangle(const char *name) {
class WinSymbolizer : public Symbolizer { return name;
public: }
explicit WinSymbolizer(IntrusiveList<SymbolizerTool> tools)
: Symbolizer(tools) {}
private: void Symbolizer::PlatformPrepareForSandboxing() {
const char *PlatformDemangle(const char *name) override { return name; } // Do nothing.
void PlatformPrepareForSandboxing() override { } }
};
Symbolizer *Symbolizer::PlatformInit() { Symbolizer *Symbolizer::PlatformInit() {
IntrusiveList<SymbolizerTool> list; IntrusiveList<SymbolizerTool> list;
list.clear(); list.clear();
list.push_back(new(symbolizer_allocator_) WinSymbolizerTool()); list.push_back(new(symbolizer_allocator_) WinSymbolizerTool());
return new(symbolizer_allocator_) WinSymbolizer(list); return new(symbolizer_allocator_) Symbolizer(list);
} }
} // namespace __sanitizer } // namespace __sanitizer