sanitizer_symbolizer.cc revision c1a1ed62228288155459d39194995a36aca4a8a6
1//===-- sanitizer_symbolizer.cc -------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file is shared between AddressSanitizer and ThreadSanitizer
11// run-time libraries.
12//===----------------------------------------------------------------------===//
13
14#include "sanitizer_platform.h"
15#include "sanitizer_internal_defs.h"
16#include "sanitizer_placement_new.h"
17#include "sanitizer_symbolizer.h"
18
19namespace __sanitizer {
20
21atomic_uintptr_t Symbolizer::symbolizer_;
22LowLevelAllocator Symbolizer::symbolizer_allocator_;
23
24Symbolizer *Symbolizer::GetOrNull() {
25  return reinterpret_cast<Symbolizer *>(
26      atomic_load(&symbolizer_, memory_order_acquire));
27}
28
29Symbolizer *Symbolizer::Get() {
30  Symbolizer *sym = GetOrNull();
31  CHECK(sym);
32  return sym;
33}
34
35Symbolizer *Symbolizer::Disable() {
36  CHECK_EQ(0, atomic_load(&symbolizer_, memory_order_acquire));
37  Symbolizer *dummy_sym = new(symbolizer_allocator_) Symbolizer;
38  atomic_store(&symbolizer_, reinterpret_cast<uptr>(&dummy_sym),
39               memory_order_release);
40  return dummy_sym;
41}
42
43}  // namespace __sanitizer
44