forked from OSchip/llvm-project
[Sanitizer] Get rid of Symbolizer::Get() and Symbolizer::GetOrNull().
We may as well just use Symbolizer::GetOrInit() in all the cases. Don't call Symbolizer::Get() early in tools initialization: these days it doesn't do any important setup work, and we may as well create the symbolizer the first time it's actually needed. llvm-svn: 217558
This commit is contained in:
parent
d0ec5ab948
commit
611c906cb3
|
|
@ -200,7 +200,7 @@ static const char *MaybeDemangleGlobalName(const char *name) {
|
||||||
else if (SANITIZER_WINDOWS && name[0] == '\01' && name[1] == '?')
|
else if (SANITIZER_WINDOWS && name[0] == '\01' && name[1] == '?')
|
||||||
should_demangle = true;
|
should_demangle = true;
|
||||||
|
|
||||||
return should_demangle ? Symbolizer::Get()->Demangle(name) : name;
|
return should_demangle ? Symbolizer::GetOrInit()->Demangle(name) : name;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the global is a zero-terminated ASCII string. If so, print it.
|
// Check if the global is a zero-terminated ASCII string. If so, print it.
|
||||||
|
|
|
||||||
|
|
@ -646,12 +646,8 @@ static void AsanInitInternal() {
|
||||||
AsanTSDInit(PlatformTSDDtor);
|
AsanTSDInit(PlatformTSDDtor);
|
||||||
InstallDeadlySignalHandlers(AsanOnSIGSEGV);
|
InstallDeadlySignalHandlers(AsanOnSIGSEGV);
|
||||||
|
|
||||||
// Allocator should be initialized before starting external symbolizer, as
|
|
||||||
// fork() on Mac locks the allocator.
|
|
||||||
InitializeAllocator();
|
InitializeAllocator();
|
||||||
|
|
||||||
Symbolizer::GetOrInit();
|
|
||||||
|
|
||||||
// On Linux AsanThread::ThreadStart() calls malloc() that's why asan_inited
|
// On Linux AsanThread::ThreadStart() calls malloc() that's why asan_inited
|
||||||
// should be set to 1 prior to initializing the threads.
|
// should be set to 1 prior to initializing the threads.
|
||||||
asan_inited = 1;
|
asan_inited = 1;
|
||||||
|
|
|
||||||
|
|
@ -50,8 +50,6 @@ extern "C" void __lsan_init() {
|
||||||
ThreadStart(tid, GetTid());
|
ThreadStart(tid, GetTid());
|
||||||
SetCurrentThread(tid);
|
SetCurrentThread(tid);
|
||||||
|
|
||||||
Symbolizer::GetOrInit();
|
|
||||||
|
|
||||||
if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit)
|
if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit)
|
||||||
Atexit(DoLeakCheck);
|
Atexit(DoLeakCheck);
|
||||||
lsan_inited = true;
|
lsan_inited = true;
|
||||||
|
|
|
||||||
|
|
@ -462,8 +462,8 @@ static Suppression *GetSuppressionForAddr(uptr addr) {
|
||||||
// Suppress by module name.
|
// Suppress by module name.
|
||||||
const char *module_name;
|
const char *module_name;
|
||||||
uptr module_offset;
|
uptr module_offset;
|
||||||
if (Symbolizer::Get()->GetModuleNameAndOffsetForPC(addr, &module_name,
|
if (Symbolizer::GetOrInit()
|
||||||
&module_offset) &&
|
->GetModuleNameAndOffsetForPC(addr, &module_name, &module_offset) &&
|
||||||
SuppressionContext::Get()->Match(module_name, SuppressionLeak, &s))
|
SuppressionContext::Get()->Match(module_name, SuppressionLeak, &s))
|
||||||
return s;
|
return s;
|
||||||
|
|
||||||
|
|
@ -471,7 +471,7 @@ static Suppression *GetSuppressionForAddr(uptr addr) {
|
||||||
static const uptr kMaxAddrFrames = 16;
|
static const uptr kMaxAddrFrames = 16;
|
||||||
InternalScopedBuffer<AddressInfo> addr_frames(kMaxAddrFrames);
|
InternalScopedBuffer<AddressInfo> addr_frames(kMaxAddrFrames);
|
||||||
for (uptr i = 0; i < kMaxAddrFrames; i++) new (&addr_frames[i]) AddressInfo();
|
for (uptr i = 0; i < kMaxAddrFrames; i++) new (&addr_frames[i]) AddressInfo();
|
||||||
uptr addr_frames_num = Symbolizer::Get()->SymbolizePC(
|
uptr addr_frames_num = Symbolizer::GetOrInit()->SymbolizePC(
|
||||||
addr, addr_frames.data(), kMaxAddrFrames);
|
addr, addr_frames.data(), kMaxAddrFrames);
|
||||||
for (uptr i = 0; i < addr_frames_num; i++) {
|
for (uptr i = 0; i < addr_frames_num; i++) {
|
||||||
if (SuppressionContext::Get()->Match(addr_frames[i].function,
|
if (SuppressionContext::Get()->Match(addr_frames[i].function,
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,6 @@
|
||||||
#include "sanitizer_common.h"
|
#include "sanitizer_common.h"
|
||||||
#include "sanitizer_flags.h"
|
#include "sanitizer_flags.h"
|
||||||
#include "sanitizer_libc.h"
|
#include "sanitizer_libc.h"
|
||||||
#include "sanitizer_stacktrace.h"
|
|
||||||
#include "sanitizer_symbolizer.h"
|
|
||||||
|
|
||||||
namespace __sanitizer {
|
namespace __sanitizer {
|
||||||
|
|
||||||
|
|
@ -197,21 +195,6 @@ void ReportErrorSummary(const char *error_type, const char *file,
|
||||||
ReportErrorSummary(buff.data());
|
ReportErrorSummary(buff.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReportErrorSummary(const char *error_type, StackTrace *stack) {
|
|
||||||
if (!common_flags()->print_summary)
|
|
||||||
return;
|
|
||||||
AddressInfo ai;
|
|
||||||
#if !SANITIZER_GO
|
|
||||||
if (stack->size > 0 && Symbolizer::Get()->CanReturnFileLineInfo()) {
|
|
||||||
// Currently, we include the first stack frame into the report summary.
|
|
||||||
// Maybe sometimes we need to choose another frame (e.g. skip memcpy/etc).
|
|
||||||
uptr pc = StackTrace::GetPreviousInstructionPc(stack->trace[0]);
|
|
||||||
Symbolizer::Get()->SymbolizePC(pc, &ai, 1);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
ReportErrorSummary(error_type, ai.file, ai.line, ai.function);
|
|
||||||
}
|
|
||||||
|
|
||||||
LoadedModule::LoadedModule(const char *module_name, uptr base_address) {
|
LoadedModule::LoadedModule(const char *module_name, uptr base_address) {
|
||||||
full_name_ = internal_strdup(module_name);
|
full_name_ = internal_strdup(module_name);
|
||||||
base_address_ = base_address;
|
base_address_ = base_address;
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,8 @@
|
||||||
|
|
||||||
#include "sanitizer_common.h"
|
#include "sanitizer_common.h"
|
||||||
#include "sanitizer_flags.h"
|
#include "sanitizer_flags.h"
|
||||||
|
#include "sanitizer_stacktrace.h"
|
||||||
|
#include "sanitizer_symbolizer.h"
|
||||||
|
|
||||||
namespace __sanitizer {
|
namespace __sanitizer {
|
||||||
|
|
||||||
|
|
@ -47,6 +49,21 @@ void SetSandboxingCallback(void (*f)()) {
|
||||||
sandboxing_callback = f;
|
sandboxing_callback = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ReportErrorSummary(const char *error_type, StackTrace *stack) {
|
||||||
|
if (!common_flags()->print_summary)
|
||||||
|
return;
|
||||||
|
AddressInfo ai;
|
||||||
|
#if !SANITIZER_GO
|
||||||
|
if (stack->size > 0 && Symbolizer::GetOrInit()->CanReturnFileLineInfo()) {
|
||||||
|
// Currently, we include the first stack frame into the report summary.
|
||||||
|
// Maybe sometimes we need to choose another frame (e.g. skip memcpy/etc).
|
||||||
|
uptr pc = StackTrace::GetPreviousInstructionPc(stack->trace[0]);
|
||||||
|
Symbolizer::GetOrInit()->SymbolizePC(pc, &ai, 1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
ReportErrorSummary(error_type, ai.file, ai.line, ai.function);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace __sanitizer
|
} // namespace __sanitizer
|
||||||
|
|
||||||
void NOINLINE
|
void NOINLINE
|
||||||
|
|
|
||||||
|
|
@ -423,8 +423,7 @@ void PrepareForSandboxing(__sanitizer_sandbox_arguments *args) {
|
||||||
MemoryMappingLayout::CacheMemoryMappings();
|
MemoryMappingLayout::CacheMemoryMappings();
|
||||||
// Same for /proc/self/exe in the symbolizer.
|
// Same for /proc/self/exe in the symbolizer.
|
||||||
#if !SANITIZER_GO
|
#if !SANITIZER_GO
|
||||||
if (Symbolizer *sym = Symbolizer::GetOrNull())
|
Symbolizer::GetOrInit()->PrepareForSandboxing();
|
||||||
sym->PrepareForSandboxing();
|
|
||||||
CovPrepareForSandboxing(args);
|
CovPrepareForSandboxing(args);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,17 +22,6 @@ Symbolizer *Symbolizer::symbolizer_;
|
||||||
StaticSpinMutex Symbolizer::init_mu_;
|
StaticSpinMutex Symbolizer::init_mu_;
|
||||||
LowLevelAllocator Symbolizer::symbolizer_allocator_;
|
LowLevelAllocator Symbolizer::symbolizer_allocator_;
|
||||||
|
|
||||||
Symbolizer *Symbolizer::GetOrNull() {
|
|
||||||
SpinMutexLock l(&init_mu_);
|
|
||||||
return symbolizer_;
|
|
||||||
}
|
|
||||||
|
|
||||||
Symbolizer *Symbolizer::Get() {
|
|
||||||
SpinMutexLock l(&init_mu_);
|
|
||||||
RAW_CHECK_MSG(symbolizer_ != 0, "Using uninitialized symbolizer!");
|
|
||||||
return symbolizer_;
|
|
||||||
}
|
|
||||||
|
|
||||||
Symbolizer *Symbolizer::Disable() {
|
Symbolizer *Symbolizer::Disable() {
|
||||||
CHECK_EQ(0, symbolizer_);
|
CHECK_EQ(0, symbolizer_);
|
||||||
// Initialize a dummy symbolizer.
|
// Initialize a dummy symbolizer.
|
||||||
|
|
|
||||||
|
|
@ -72,12 +72,6 @@ struct DataInfo {
|
||||||
|
|
||||||
class Symbolizer {
|
class Symbolizer {
|
||||||
public:
|
public:
|
||||||
/// Returns platform-specific implementation of Symbolizer. The symbolizer
|
|
||||||
/// must be initialized (with init or disable) before calling this function.
|
|
||||||
static Symbolizer *Get();
|
|
||||||
/// Returns platform-specific implementation of Symbolizer, or null if not
|
|
||||||
/// initialized.
|
|
||||||
static Symbolizer *GetOrNull();
|
|
||||||
/// 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).
|
||||||
static Symbolizer *GetOrInit();
|
static Symbolizer *GetOrInit();
|
||||||
|
|
|
||||||
|
|
@ -111,7 +111,7 @@ ReportStack *SymbolizeCode(uptr addr) {
|
||||||
InternalScopedBuffer<AddressInfo> addr_frames(kMaxAddrFrames);
|
InternalScopedBuffer<AddressInfo> addr_frames(kMaxAddrFrames);
|
||||||
for (uptr i = 0; i < kMaxAddrFrames; i++)
|
for (uptr i = 0; i < kMaxAddrFrames; i++)
|
||||||
new(&addr_frames[i]) AddressInfo();
|
new(&addr_frames[i]) AddressInfo();
|
||||||
uptr addr_frames_num = Symbolizer::Get()->SymbolizePC(
|
uptr addr_frames_num = Symbolizer::GetOrInit()->SymbolizePC(
|
||||||
addr, addr_frames.data(), kMaxAddrFrames);
|
addr, addr_frames.data(), kMaxAddrFrames);
|
||||||
if (addr_frames_num == 0)
|
if (addr_frames_num == 0)
|
||||||
return NewReportStackEntry(addr);
|
return NewReportStackEntry(addr);
|
||||||
|
|
@ -132,7 +132,7 @@ ReportStack *SymbolizeCode(uptr addr) {
|
||||||
|
|
||||||
ReportLocation *SymbolizeData(uptr addr) {
|
ReportLocation *SymbolizeData(uptr addr) {
|
||||||
DataInfo info;
|
DataInfo info;
|
||||||
if (!Symbolizer::Get()->SymbolizeData(addr, &info))
|
if (!Symbolizer::GetOrInit()->SymbolizeData(addr, &info))
|
||||||
return 0;
|
return 0;
|
||||||
ReportLocation *ent = (ReportLocation*)internal_alloc(MBlockReportStack,
|
ReportLocation *ent = (ReportLocation*)internal_alloc(MBlockReportStack,
|
||||||
sizeof(ReportLocation));
|
sizeof(ReportLocation));
|
||||||
|
|
@ -148,7 +148,7 @@ ReportLocation *SymbolizeData(uptr addr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void SymbolizeFlush() {
|
void SymbolizeFlush() {
|
||||||
Symbolizer::Get()->Flush();
|
Symbolizer::GetOrInit()->Flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace __tsan
|
} // namespace __tsan
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ Location __ubsan::getFunctionLocation(uptr Loc, const char **FName) {
|
||||||
InitIfNecessary();
|
InitIfNecessary();
|
||||||
|
|
||||||
AddressInfo Info;
|
AddressInfo Info;
|
||||||
if (!Symbolizer::Get()->SymbolizePC(Loc, &Info, 1) || !Info.module ||
|
if (!Symbolizer::GetOrInit()->SymbolizePC(Loc, &Info, 1) || !Info.module ||
|
||||||
!*Info.module)
|
!*Info.module)
|
||||||
return Location(Loc);
|
return Location(Loc);
|
||||||
|
|
||||||
|
|
@ -148,7 +148,7 @@ static void renderText(const char *Message, const Diag::Arg *Args) {
|
||||||
Printf("%s", A.String);
|
Printf("%s", A.String);
|
||||||
break;
|
break;
|
||||||
case Diag::AK_Mangled: {
|
case Diag::AK_Mangled: {
|
||||||
Printf("'%s'", Symbolizer::Get()->Demangle(A.String));
|
Printf("'%s'", Symbolizer::GetOrInit()->Demangle(A.String));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Diag::AK_SInt:
|
case Diag::AK_SInt:
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,6 @@ void __ubsan::InitIfNecessary() {
|
||||||
// in this function.
|
// in this function.
|
||||||
SanitizerToolName = "UndefinedBehaviorSanitizer";
|
SanitizerToolName = "UndefinedBehaviorSanitizer";
|
||||||
InitializeCommonFlags();
|
InitializeCommonFlags();
|
||||||
Symbolizer::GetOrInit();
|
|
||||||
}
|
}
|
||||||
// Initialize UBSan-specific flags.
|
// Initialize UBSan-specific flags.
|
||||||
InitializeFlags();
|
InitializeFlags();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue