brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.9 KiB · 519f768 Raw
145 lines · cpp
1//===-- sanitizer_symbolizer.cpp ------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file is shared between AddressSanitizer and ThreadSanitizer10// run-time libraries.11//===----------------------------------------------------------------------===//12 13#include <errno.h>14 15#include "sanitizer_allocator_internal.h"16#include "sanitizer_common.h"17#include "sanitizer_internal_defs.h"18#include "sanitizer_libc.h"19#include "sanitizer_placement_new.h"20#include "sanitizer_platform.h"21#include "sanitizer_symbolizer_internal.h"22 23namespace __sanitizer {24 25AddressInfo::AddressInfo() {26  internal_memset(this, 0, sizeof(AddressInfo));27  function_offset = kUnknown;28}29 30void AddressInfo::Clear() {31  InternalFree(module);32  InternalFree(function);33  InternalFree(file);34  internal_memset(this, 0, sizeof(AddressInfo));35  function_offset = kUnknown;36  uuid_size = 0;37}38 39void AddressInfo::FillModuleInfo(const char *mod_name, uptr mod_offset,40                                 ModuleArch mod_arch) {41  module = internal_strdup(mod_name);42  module_offset = mod_offset;43  module_arch = mod_arch;44  uuid_size = 0;45}46 47void AddressInfo::FillModuleInfo(const LoadedModule &mod) {48  module = internal_strdup(mod.full_name());49  module_offset = address - mod.base_address();50  module_arch = mod.arch();51  if (mod.uuid_size())52    internal_memcpy(uuid, mod.uuid(), mod.uuid_size());53  uuid_size = mod.uuid_size();54}55 56SymbolizedStack::SymbolizedStack() : next(nullptr), info() {}57 58SymbolizedStack *SymbolizedStack::New(uptr addr) {59  void *mem = InternalAlloc(sizeof(SymbolizedStack));60  SymbolizedStack *res = new(mem) SymbolizedStack();61  res->info.address = addr;62  return res;63}64 65void SymbolizedStack::ClearAll() {66  info.Clear();67  if (next)68    next->ClearAll();69  InternalFree(this);70}71 72DataInfo::DataInfo() {73  internal_memset(this, 0, sizeof(DataInfo));74}75 76void DataInfo::Clear() {77  InternalFree(module);78  InternalFree(file);79  InternalFree(name);80  internal_memset(this, 0, sizeof(DataInfo));81}82 83void FrameInfo::Clear() {84  InternalFree(module);85  for (LocalInfo &local : locals) {86    InternalFree(local.function_name);87    InternalFree(local.name);88    InternalFree(local.decl_file);89  }90  locals.clear();91}92 93Symbolizer *Symbolizer::symbolizer_;94StaticSpinMutex Symbolizer::init_mu_;95LowLevelAllocator Symbolizer::symbolizer_allocator_;96 97void Symbolizer::InvalidateModuleList() {98  modules_fresh_ = false;99}100 101void Symbolizer::AddHooks(Symbolizer::StartSymbolizationHook start_hook,102                          Symbolizer::EndSymbolizationHook end_hook) {103  CHECK(start_hook_ == 0 && end_hook_ == 0);104  start_hook_ = start_hook;105  end_hook_ = end_hook;106}107 108const char *Symbolizer::ModuleNameOwner::GetOwnedCopy(const char *str) {109  mu_->CheckLocked();110 111  // 'str' will be the same string multiple times in a row, optimize this case.112  if (last_match_ && !internal_strcmp(last_match_, str))113    return last_match_;114 115  // FIXME: this is linear search.116  // We should optimize this further if this turns out to be a bottleneck later.117  for (uptr i = 0; i < storage_.size(); ++i) {118    if (!internal_strcmp(storage_[i], str)) {119      last_match_ = storage_[i];120      return last_match_;121    }122  }123  last_match_ = internal_strdup(str);124  storage_.push_back(last_match_);125  return last_match_;126}127 128Symbolizer::Symbolizer(IntrusiveList<SymbolizerTool> tools)129    : module_names_(&mu_), modules_(), modules_fresh_(false), tools_(tools),130      start_hook_(0), end_hook_(0) {}131 132Symbolizer::SymbolizerScope::SymbolizerScope(const Symbolizer *sym)133    : sym_(sym), errno_(errno) {134  if (sym_->start_hook_)135    sym_->start_hook_();136}137 138Symbolizer::SymbolizerScope::~SymbolizerScope() {139  if (sym_->end_hook_)140    sym_->end_hook_();141  errno = errno_;142}143 144}  // namespace __sanitizer145