1254721Semaste//===-- AddressResolverFileLine.cpp -----------------------------*- C++ -*-===// 2254721Semaste// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6254721Semaste// 7254721Semaste//===----------------------------------------------------------------------===// 8254721Semaste 9254721Semaste#include "lldb/Core/AddressResolverFileLine.h" 10254721Semaste 11344779Sdim#include "lldb/Core/Address.h" 12344779Sdim#include "lldb/Core/AddressRange.h" 13254721Semaste#include "lldb/Symbol/CompileUnit.h" 14344779Sdim#include "lldb/Symbol/LineEntry.h" 15254721Semaste#include "lldb/Symbol/SymbolContext.h" 16344779Sdim#include "lldb/Utility/ConstString.h" 17321369Sdim#include "lldb/Utility/Log.h" 18344779Sdim#include "lldb/Utility/Logging.h" 19344779Sdim#include "lldb/Utility/Stream.h" 20321369Sdim#include "lldb/Utility/StreamString.h" 21344779Sdim#include "lldb/lldb-enumerations.h" 22344779Sdim#include "lldb/lldb-types.h" 23254721Semaste 24344779Sdim#include <inttypes.h> 25344779Sdim#include <vector> 26321369Sdim 27254721Semasteusing namespace lldb; 28254721Semasteusing namespace lldb_private; 29254721Semaste 30254721Semaste// AddressResolverFileLine: 31314564SdimAddressResolverFileLine::AddressResolverFileLine(const FileSpec &file_spec, 32314564Sdim uint32_t line_no, 33314564Sdim bool check_inlines) 34314564Sdim : AddressResolver(), m_file_spec(file_spec), m_line_number(line_no), 35314564Sdim m_inlines(check_inlines) {} 36254721Semaste 37314564SdimAddressResolverFileLine::~AddressResolverFileLine() {} 38254721Semaste 39254721SemasteSearcher::CallbackReturn 40314564SdimAddressResolverFileLine::SearchCallback(SearchFilter &filter, 41360784Sdim SymbolContext &context, Address *addr) { 42314564Sdim SymbolContextList sc_list; 43314564Sdim CompileUnit *cu = context.comp_unit; 44254721Semaste 45314564Sdim Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS)); 46254721Semaste 47360784Sdim cu->ResolveSymbolContext(m_file_spec, m_line_number, m_inlines, false, 48360784Sdim eSymbolContextEverything, sc_list); 49360784Sdim uint32_t sc_list_size = sc_list.GetSize(); 50314564Sdim for (uint32_t i = 0; i < sc_list_size; i++) { 51314564Sdim SymbolContext sc; 52314564Sdim if (sc_list.GetContextAtIndex(i, sc)) { 53314564Sdim Address line_start = sc.line_entry.range.GetBaseAddress(); 54314564Sdim addr_t byte_size = sc.line_entry.range.GetByteSize(); 55314564Sdim if (line_start.IsValid()) { 56314564Sdim AddressRange new_range(line_start, byte_size); 57314564Sdim m_address_ranges.push_back(new_range); 58314564Sdim if (log) { 59314564Sdim StreamString s; 60314564Sdim // new_bp_loc->GetDescription (&s, lldb::eDescriptionLevelVerbose); 61360784Sdim // LLDB_LOGF(log, "Added address: %s\n", s.GetData()); 62254721Semaste } 63314564Sdim } else { 64360784Sdim LLDB_LOGF(log, 65360784Sdim "error: Unable to resolve address at file address 0x%" PRIx64 66360784Sdim " for %s:%d\n", 67360784Sdim line_start.GetFileAddress(), 68360784Sdim m_file_spec.GetFilename().AsCString("<Unknown>"), 69360784Sdim m_line_number); 70314564Sdim } 71254721Semaste } 72314564Sdim } 73314564Sdim return Searcher::eCallbackReturnContinue; 74254721Semaste} 75254721Semaste 76344779Sdimlldb::SearchDepth AddressResolverFileLine::GetDepth() { 77344779Sdim return lldb::eSearchDepthCompUnit; 78254721Semaste} 79254721Semaste 80314564Sdimvoid AddressResolverFileLine::GetDescription(Stream *s) { 81314564Sdim s->Printf("File and line address - file: \"%s\" line: %u", 82314564Sdim m_file_spec.GetFilename().AsCString("<Unknown>"), m_line_number); 83254721Semaste} 84