tsan: add IsSymbolizerAvailable() function for querying for presence of internal/external symbolizer

llvm-svn: 173783
This commit is contained in:
Dmitry Vyukov 2013-01-29 09:35:14 +00:00
parent b130fc3c0d
commit 7943b69002
3 changed files with 35 additions and 24 deletions

View File

@ -315,6 +315,12 @@ class Symbolizer {
return true;
}
bool IsSymbolizerAvailable() {
if (internal_symbolizer_ == 0)
internal_symbolizer_ = InternalSymbolizer::get();
return internal_symbolizer_ || external_symbolizer_;
}
private:
char *SendCommand(bool is_data, const char *module_name, uptr module_offset) {
// First, try to use internal symbolizer.
@ -397,4 +403,8 @@ bool InitializeExternalSymbolizer(const char *path_to_symbolizer) {
return symbolizer.InitializeExternalSymbolizer(path_to_symbolizer);
}
bool IsSymbolizerAvailable() {
return symbolizer.IsSymbolizerAvailable();
}
} // namespace __sanitizer

View File

@ -69,6 +69,8 @@ struct DataInfo {
uptr SymbolizeCode(uptr address, AddressInfo *frames, uptr max_frames);
bool SymbolizeData(uptr address, DataInfo *info);
bool IsSymbolizerAvailable();
// Attempts to demangle the provided C++ mangled name.
const char *Demangle(const char *Name);

View File

@ -55,7 +55,8 @@ static ReportStack *NewReportStackEntry(const AddressInfo &info) {
}
ReportStack *SymbolizeCode(uptr addr) {
if (flags()->external_symbolizer_path[0]) {
if (!IsSymbolizerAvailable())
return SymbolizeCodeAddr2Line(addr);
static const uptr kMaxAddrFrames = 16;
InternalScopedBuffer<AddressInfo> addr_frames(kMaxAddrFrames);
for (uptr i = 0; i < kMaxAddrFrames; i++)
@ -78,11 +79,9 @@ ReportStack *SymbolizeCode(uptr addr) {
}
return top;
}
return SymbolizeCodeAddr2Line(addr);
}
ReportLocation *SymbolizeData(uptr addr) {
if (flags()->external_symbolizer_path[0] == 0)
if (!IsSymbolizerAvailable())
return 0;
DataInfo info;
if (!__sanitizer::SymbolizeData(addr, &info))