forked from OSchip/llvm-project
tsan: add IsSymbolizerAvailable() function for querying for presence of internal/external symbolizer
llvm-svn: 173783
This commit is contained in:
parent
b130fc3c0d
commit
7943b69002
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -55,34 +55,33 @@ static ReportStack *NewReportStackEntry(const AddressInfo &info) {
|
|||
}
|
||||
|
||||
ReportStack *SymbolizeCode(uptr addr) {
|
||||
if (flags()->external_symbolizer_path[0]) {
|
||||
static const uptr kMaxAddrFrames = 16;
|
||||
InternalScopedBuffer<AddressInfo> addr_frames(kMaxAddrFrames);
|
||||
for (uptr i = 0; i < kMaxAddrFrames; i++)
|
||||
new(&addr_frames[i]) AddressInfo();
|
||||
uptr addr_frames_num = __sanitizer::SymbolizeCode(addr, addr_frames.data(),
|
||||
kMaxAddrFrames);
|
||||
if (addr_frames_num == 0)
|
||||
return NewReportStackEntry(addr);
|
||||
ReportStack *top = 0;
|
||||
ReportStack *bottom = 0;
|
||||
for (uptr i = 0; i < addr_frames_num; i++) {
|
||||
ReportStack *cur_entry = NewReportStackEntry(addr_frames[i]);
|
||||
CHECK(cur_entry);
|
||||
addr_frames[i].Clear();
|
||||
if (i == 0)
|
||||
top = cur_entry;
|
||||
else
|
||||
bottom->next = cur_entry;
|
||||
bottom = cur_entry;
|
||||
}
|
||||
return top;
|
||||
if (!IsSymbolizerAvailable())
|
||||
return SymbolizeCodeAddr2Line(addr);
|
||||
static const uptr kMaxAddrFrames = 16;
|
||||
InternalScopedBuffer<AddressInfo> addr_frames(kMaxAddrFrames);
|
||||
for (uptr i = 0; i < kMaxAddrFrames; i++)
|
||||
new(&addr_frames[i]) AddressInfo();
|
||||
uptr addr_frames_num = __sanitizer::SymbolizeCode(addr, addr_frames.data(),
|
||||
kMaxAddrFrames);
|
||||
if (addr_frames_num == 0)
|
||||
return NewReportStackEntry(addr);
|
||||
ReportStack *top = 0;
|
||||
ReportStack *bottom = 0;
|
||||
for (uptr i = 0; i < addr_frames_num; i++) {
|
||||
ReportStack *cur_entry = NewReportStackEntry(addr_frames[i]);
|
||||
CHECK(cur_entry);
|
||||
addr_frames[i].Clear();
|
||||
if (i == 0)
|
||||
top = cur_entry;
|
||||
else
|
||||
bottom->next = cur_entry;
|
||||
bottom = cur_entry;
|
||||
}
|
||||
return SymbolizeCodeAddr2Line(addr);
|
||||
return top;
|
||||
}
|
||||
|
||||
ReportLocation *SymbolizeData(uptr addr) {
|
||||
if (flags()->external_symbolizer_path[0] == 0)
|
||||
if (!IsSymbolizerAvailable())
|
||||
return 0;
|
||||
DataInfo info;
|
||||
if (!__sanitizer::SymbolizeData(addr, &info))
|
||||
|
|
Loading…
Reference in New Issue