Path: blob/main/contrib/llvm-project/lldb/source/Plugins/InstrumentationRuntime/ASanLibsanitizers/InstrumentationRuntimeASanLibsanitizers.cpp
39653 views
//===-- InstrumentationRuntimeASanLibsanitizers.cpp -----------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "InstrumentationRuntimeASanLibsanitizers.h"910#include "lldb/Breakpoint/StoppointCallbackContext.h"11#include "lldb/Core/Module.h"12#include "lldb/Core/PluginInterface.h"13#include "lldb/Core/PluginManager.h"14#include "lldb/Symbol/Symbol.h"15#include "lldb/Target/Process.h"16#include "lldb/Utility/RegularExpression.h"1718#include "Plugins/InstrumentationRuntime/Utility/ReportRetriever.h"1920using namespace lldb;21using namespace lldb_private;2223LLDB_PLUGIN_DEFINE(InstrumentationRuntimeASanLibsanitizers)2425lldb::InstrumentationRuntimeSP26InstrumentationRuntimeASanLibsanitizers::CreateInstance(27const lldb::ProcessSP &process_sp) {28return InstrumentationRuntimeSP(29new InstrumentationRuntimeASanLibsanitizers(process_sp));30}3132void InstrumentationRuntimeASanLibsanitizers::Initialize() {33PluginManager::RegisterPlugin(34GetPluginNameStatic(),35"AddressSanitizer instrumentation runtime plugin for Libsanitizers.",36CreateInstance, GetTypeStatic);37}3839void InstrumentationRuntimeASanLibsanitizers::Terminate() {40PluginManager::UnregisterPlugin(CreateInstance);41}4243lldb::InstrumentationRuntimeType44InstrumentationRuntimeASanLibsanitizers::GetTypeStatic() {45return eInstrumentationRuntimeTypeLibsanitizersAsan;46}4748InstrumentationRuntimeASanLibsanitizers::49~InstrumentationRuntimeASanLibsanitizers() {50Deactivate();51}5253const RegularExpression &54InstrumentationRuntimeASanLibsanitizers::GetPatternForRuntimeLibrary() {55static RegularExpression regex(56llvm::StringRef("libsystem_sanitizers\\.dylib"));57return regex;58}5960bool InstrumentationRuntimeASanLibsanitizers::CheckIfRuntimeIsValid(61const lldb::ModuleSP module_sp) {62const Symbol *symbol = module_sp->FindFirstSymbolWithNameAndType(63ConstString("__asan_abi_init"), lldb::eSymbolTypeAny);6465return symbol != nullptr;66}6768bool InstrumentationRuntimeASanLibsanitizers::NotifyBreakpointHit(69void *baton, StoppointCallbackContext *context, user_id_t break_id,70user_id_t break_loc_id) {71assert(baton && "null baton");72if (!baton)73return false;7475InstrumentationRuntimeASanLibsanitizers *const instance =76static_cast<InstrumentationRuntimeASanLibsanitizers *>(baton);7778ProcessSP process_sp = instance->GetProcessSP();7980return ReportRetriever::NotifyBreakpointHit(process_sp, context, break_id,81break_loc_id);82}8384void InstrumentationRuntimeASanLibsanitizers::Activate() {85if (IsActive())86return;8788ProcessSP process_sp = GetProcessSP();89if (!process_sp)90return;9192lldb::ModuleSP module_sp = GetRuntimeModuleSP();9394Breakpoint *breakpoint = ReportRetriever::SetupBreakpoint(95module_sp, process_sp, ConstString("sanitizers_address_on_report"));9697if (!breakpoint) {98breakpoint = ReportRetriever::SetupBreakpoint(99module_sp, process_sp,100ConstString("_Z22raise_sanitizers_error23sanitizer_error_context"));101}102103if (!breakpoint)104return;105106const bool sync = false;107108breakpoint->SetCallback(109InstrumentationRuntimeASanLibsanitizers::NotifyBreakpointHit, this, sync);110breakpoint->SetBreakpointKind("address-sanitizer-report");111SetBreakpointID(breakpoint->GetID());112113SetActive(true);114}115116void InstrumentationRuntimeASanLibsanitizers::Deactivate() {117SetActive(false);118119if (GetBreakpointID() == LLDB_INVALID_BREAK_ID)120return;121122if (ProcessSP process_sp = GetProcessSP()) {123process_sp->GetTarget().RemoveBreakpointByID(GetBreakpointID());124SetBreakpointID(LLDB_INVALID_BREAK_ID);125}126}127128129