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

View File

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

View File

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