10b57cec5SDimitry Andric //===-- BreakpointResolverFileLine.h ----------------------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
95ffd83dbSDimitry Andric #ifndef LLDB_BREAKPOINT_BREAKPOINTRESOLVERFILELINE_H
105ffd83dbSDimitry Andric #define LLDB_BREAKPOINT_BREAKPOINTRESOLVERFILELINE_H
110b57cec5SDimitry Andric 
120b57cec5SDimitry Andric #include "lldb/Breakpoint/BreakpointResolver.h"
13fe6060f1SDimitry Andric #include "lldb/Core/SourceLocationSpec.h"
14bdd1243dSDimitry Andric #include <optional>
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric namespace lldb_private {
170b57cec5SDimitry Andric 
180b57cec5SDimitry Andric /// \class BreakpointResolverFileLine BreakpointResolverFileLine.h
190b57cec5SDimitry Andric /// "lldb/Breakpoint/BreakpointResolverFileLine.h" This class sets breakpoints
200b57cec5SDimitry Andric /// by file and line.  Optionally, it will look for inlined instances of the
210b57cec5SDimitry Andric /// file and line specification.
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric class BreakpointResolverFileLine : public BreakpointResolver {
240b57cec5SDimitry Andric public:
25bdd1243dSDimitry Andric   BreakpointResolverFileLine(
26bdd1243dSDimitry Andric       const lldb::BreakpointSP &bkpt, lldb::addr_t offset, bool skip_prologue,
27bdd1243dSDimitry Andric       const SourceLocationSpec &location_spec,
28bdd1243dSDimitry Andric       std::optional<llvm::StringRef> removed_prefix_opt = std::nullopt);
290b57cec5SDimitry Andric 
305f757f3fSDimitry Andric   static lldb::BreakpointResolverSP
315f757f3fSDimitry Andric   CreateFromStructuredData(const StructuredData::Dictionary &data_dict,
320b57cec5SDimitry Andric                            Status &error);
330b57cec5SDimitry Andric 
340b57cec5SDimitry Andric   StructuredData::ObjectSP SerializeToStructuredData() override;
350b57cec5SDimitry Andric 
365ffd83dbSDimitry Andric   ~BreakpointResolverFileLine() override = default;
370b57cec5SDimitry Andric 
380b57cec5SDimitry Andric   Searcher::CallbackReturn SearchCallback(SearchFilter &filter,
399dba64beSDimitry Andric                                           SymbolContext &context,
409dba64beSDimitry Andric                                           Address *addr) override;
410b57cec5SDimitry Andric 
420b57cec5SDimitry Andric   lldb::SearchDepth GetDepth() override;
430b57cec5SDimitry Andric 
440b57cec5SDimitry Andric   void GetDescription(Stream *s) override;
450b57cec5SDimitry Andric 
460b57cec5SDimitry Andric   void Dump(Stream *s) const override;
470b57cec5SDimitry Andric 
480b57cec5SDimitry Andric   /// Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const BreakpointResolverFileLine *)490b57cec5SDimitry Andric   static inline bool classof(const BreakpointResolverFileLine *) {
500b57cec5SDimitry Andric     return true;
510b57cec5SDimitry Andric   }
classof(const BreakpointResolver * V)520b57cec5SDimitry Andric   static inline bool classof(const BreakpointResolver *V) {
530b57cec5SDimitry Andric     return V->getResolverID() == BreakpointResolver::FileLineResolver;
540b57cec5SDimitry Andric   }
550b57cec5SDimitry Andric 
565ffd83dbSDimitry Andric   lldb::BreakpointResolverSP
575ffd83dbSDimitry Andric   CopyForBreakpoint(lldb::BreakpointSP &breakpoint) override;
580b57cec5SDimitry Andric 
590b57cec5SDimitry Andric protected:
60bdd1243dSDimitry Andric   void FilterContexts(SymbolContextList &sc_list);
6106c3fb27SDimitry Andric   void DeduceSourceMapping(const SymbolContextList &sc_list);
620b57cec5SDimitry Andric 
630b57cec5SDimitry Andric   friend class Breakpoint;
64fe6060f1SDimitry Andric   SourceLocationSpec m_location_spec;
650b57cec5SDimitry Andric   bool m_skip_prologue;
66bdd1243dSDimitry Andric   // Any previously removed file path prefix by reverse source mapping.
67bdd1243dSDimitry Andric   // This is used to auto deduce source map if needed.
68bdd1243dSDimitry Andric   std::optional<llvm::StringRef> m_removed_prefix_opt;
690b57cec5SDimitry Andric 
700b57cec5SDimitry Andric private:
715ffd83dbSDimitry Andric   BreakpointResolverFileLine(const BreakpointResolverFileLine &) = delete;
725ffd83dbSDimitry Andric   const BreakpointResolverFileLine &
735ffd83dbSDimitry Andric   operator=(const BreakpointResolverFileLine &) = delete;
740b57cec5SDimitry Andric };
750b57cec5SDimitry Andric 
760b57cec5SDimitry Andric } // namespace lldb_private
770b57cec5SDimitry Andric 
785ffd83dbSDimitry Andric #endif // LLDB_BREAKPOINT_BREAKPOINTRESOLVERFILELINE_H
79