diff options
Diffstat (limited to 'include/lldb/Breakpoint/BreakpointResolver.h')
-rw-r--r-- | include/lldb/Breakpoint/BreakpointResolver.h | 356 |
1 files changed, 214 insertions, 142 deletions
diff --git a/include/lldb/Breakpoint/BreakpointResolver.h b/include/lldb/Breakpoint/BreakpointResolver.h index b117e668a1bd..e19a2135fbd2 100644 --- a/include/lldb/Breakpoint/BreakpointResolver.h +++ b/include/lldb/Breakpoint/BreakpointResolver.h @@ -14,20 +14,22 @@ // C++ Includes // Other libraries and framework includes // Project includes -#include "lldb/lldb-private.h" -#include "lldb/Core/Address.h" #include "lldb/Breakpoint/Breakpoint.h" #include "lldb/Breakpoint/BreakpointResolver.h" -#include "lldb/Host/FileSpec.h" +#include "lldb/Core/Address.h" +#include "lldb/Core/ConstString.h" #include "lldb/Core/RegularExpression.h" #include "lldb/Core/SearchFilter.h" -#include "lldb/Core/ConstString.h" +#include "lldb/Host/FileSpec.h" +#include "lldb/lldb-private.h" namespace lldb_private { //---------------------------------------------------------------------- -/// @class BreakpointResolver BreakpointResolver.h "lldb/Breakpoint/BreakpointResolver.h" -/// @brief This class works with SearchFilter to resolve logical breakpoints to their +/// @class BreakpointResolver BreakpointResolver.h +/// "lldb/Breakpoint/BreakpointResolver.h" +/// @brief This class works with SearchFilter to resolve logical breakpoints to +/// their /// of concrete breakpoint locations. //---------------------------------------------------------------------- @@ -35,150 +37,220 @@ namespace lldb_private { /// General Outline: /// The BreakpointResolver is a Searcher. In that protocol, /// the SearchFilter asks the question "At what depth of the symbol context -/// descent do you want your callback to get called?" of the filter. The resolver -/// answers this question (in the GetDepth method) and provides the resolution callback. -/// Each Breakpoint has a BreakpointResolver, and it calls either ResolveBreakpoint -/// or ResolveBreakpointInModules to tell it to look for new breakpoint locations. +/// descent do you want your callback to get called?" of the filter. The +/// resolver +/// answers this question (in the GetDepth method) and provides the resolution +/// callback. +/// Each Breakpoint has a BreakpointResolver, and it calls either +/// ResolveBreakpoint +/// or ResolveBreakpointInModules to tell it to look for new breakpoint +/// locations. //---------------------------------------------------------------------- -class BreakpointResolver : - public Searcher -{ -friend class Breakpoint; +class BreakpointResolver : public Searcher { + friend class Breakpoint; public: - //------------------------------------------------------------------ - /// The breakpoint resolver need to have a breakpoint for "ResolveBreakpoint - /// to make sense. It can be constructed without a breakpoint, but you have to - /// call SetBreakpoint before ResolveBreakpoint. - /// - /// @param[in] bkpt - /// The breakpoint that owns this resolver. - /// @param[in] resolverType - /// The concrete breakpoint resolver type for this breakpoint. - /// - /// @result - /// Returns breakpoint location id. - //------------------------------------------------------------------ - BreakpointResolver (Breakpoint *bkpt, unsigned char resolverType, lldb::addr_t offset = 0); - - //------------------------------------------------------------------ - /// The Destructor is virtual, all significant breakpoint resolvers derive - /// from this class. - //------------------------------------------------------------------ - ~BreakpointResolver() override; - - //------------------------------------------------------------------ - /// This sets the breakpoint for this resolver. - /// - /// @param[in] bkpt - /// The breakpoint that owns this resolver. - //------------------------------------------------------------------ - void - SetBreakpoint (Breakpoint *bkpt); - - //------------------------------------------------------------------ - /// This updates the offset for this breakpoint. All the locations currently - /// set for this breakpoint will have their offset adjusted when this is called. - /// - /// @param[in] offset - /// The offset to add to all locations. - //------------------------------------------------------------------ - void - SetOffset (lldb::addr_t offset); - - //------------------------------------------------------------------ - /// This updates the offset for this breakpoint. All the locations currently - /// set for this breakpoint will have their offset adjusted when this is called. - /// - /// @param[in] offset - /// The offset to add to all locations. - //------------------------------------------------------------------ - lldb::addr_t - GetOffset () const - { - return m_offset; - } - - //------------------------------------------------------------------ - /// In response to this method the resolver scans all the modules in the breakpoint's - /// target, and adds any new locations it finds. - /// - /// @param[in] filter - /// The filter that will manage the search for this resolver. - //------------------------------------------------------------------ - virtual void - ResolveBreakpoint (SearchFilter &filter); - - //------------------------------------------------------------------ - /// In response to this method the resolver scans the modules in the module list - /// \a modules, and adds any new locations it finds. - /// - /// @param[in] filter - /// The filter that will manage the search for this resolver. - //------------------------------------------------------------------ - virtual void - ResolveBreakpointInModules (SearchFilter &filter, - ModuleList &modules); - - //------------------------------------------------------------------ - /// Prints a canonical description for the breakpoint to the stream \a s. - /// - /// @param[in] s - /// Stream to which the output is copied. - //------------------------------------------------------------------ - void - GetDescription(Stream *s) override = 0; - - //------------------------------------------------------------------ - /// Standard "Dump" method. At present it does nothing. - //------------------------------------------------------------------ - virtual void - Dump (Stream *s) const = 0; - - //------------------------------------------------------------------ - /// An enumeration for keeping track of the concrete subclass that - /// is actually instantiated. Values of this enumeration are kept in the - /// BreakpointResolver's SubclassID field. They are used for concrete type - /// identification. - enum ResolverTy { - FileLineResolver, // This is an instance of BreakpointResolverFileLine - AddressResolver, // This is an instance of BreakpointResolverAddress - NameResolver, // This is an instance of BreakpointResolverName - FileRegexResolver, - ExceptionResolver, - LastKnownResolverType = ExceptionResolver - }; - - //------------------------------------------------------------------ - /// getResolverID - Return an ID for the concrete type of this object. This - /// is used to implement the LLVM classof checks. This should not be used - /// for any other purpose, as the values may change as LLDB evolves. - unsigned getResolverID() const { - return SubclassID; - } - - virtual lldb::BreakpointResolverSP - CopyForBreakpoint (Breakpoint &breakpoint) = 0; + //------------------------------------------------------------------ + /// The breakpoint resolver need to have a breakpoint for "ResolveBreakpoint + /// to make sense. It can be constructed without a breakpoint, but you have + /// to + /// call SetBreakpoint before ResolveBreakpoint. + /// + /// @param[in] bkpt + /// The breakpoint that owns this resolver. + /// @param[in] resolverType + /// The concrete breakpoint resolver type for this breakpoint. + /// + /// @result + /// Returns breakpoint location id. + //------------------------------------------------------------------ + BreakpointResolver(Breakpoint *bkpt, unsigned char resolverType, + lldb::addr_t offset = 0); + + //------------------------------------------------------------------ + /// The Destructor is virtual, all significant breakpoint resolvers derive + /// from this class. + //------------------------------------------------------------------ + ~BreakpointResolver() override; + + //------------------------------------------------------------------ + /// This sets the breakpoint for this resolver. + /// + /// @param[in] bkpt + /// The breakpoint that owns this resolver. + //------------------------------------------------------------------ + void SetBreakpoint(Breakpoint *bkpt); + + //------------------------------------------------------------------ + /// This updates the offset for this breakpoint. All the locations currently + /// set for this breakpoint will have their offset adjusted when this is + /// called. + /// + /// @param[in] offset + /// The offset to add to all locations. + //------------------------------------------------------------------ + void SetOffset(lldb::addr_t offset); + + //------------------------------------------------------------------ + /// This updates the offset for this breakpoint. All the locations currently + /// set for this breakpoint will have their offset adjusted when this is + /// called. + /// + /// @param[in] offset + /// The offset to add to all locations. + //------------------------------------------------------------------ + lldb::addr_t GetOffset() const { return m_offset; } + + //------------------------------------------------------------------ + /// In response to this method the resolver scans all the modules in the + /// breakpoint's + /// target, and adds any new locations it finds. + /// + /// @param[in] filter + /// The filter that will manage the search for this resolver. + //------------------------------------------------------------------ + virtual void ResolveBreakpoint(SearchFilter &filter); + + //------------------------------------------------------------------ + /// In response to this method the resolver scans the modules in the module + /// list + /// \a modules, and adds any new locations it finds. + /// + /// @param[in] filter + /// The filter that will manage the search for this resolver. + //------------------------------------------------------------------ + virtual void ResolveBreakpointInModules(SearchFilter &filter, + ModuleList &modules); + + //------------------------------------------------------------------ + /// Prints a canonical description for the breakpoint to the stream \a s. + /// + /// @param[in] s + /// Stream to which the output is copied. + //------------------------------------------------------------------ + void GetDescription(Stream *s) override = 0; + + //------------------------------------------------------------------ + /// Standard "Dump" method. At present it does nothing. + //------------------------------------------------------------------ + virtual void Dump(Stream *s) const = 0; + + /// This section handles serializing and deserializing from StructuredData + /// objects. + + static lldb::BreakpointResolverSP + CreateFromStructuredData(const StructuredData::Dictionary &resolver_dict, + Error &error); + + virtual StructuredData::ObjectSP SerializeToStructuredData() { + return StructuredData::ObjectSP(); + } + + static const char *GetSerializationKey() { return "BKPTResolver"; } + + static const char *GetSerializationSubclassKey() { return "Type"; } + + static const char *GetSerializationSubclassOptionsKey() { return "Options"; } + + StructuredData::DictionarySP + WrapOptionsDict(StructuredData::DictionarySP options_dict_sp); + + //------------------------------------------------------------------ + //------------------------------------------------------------------ + /// An enumeration for keeping track of the concrete subclass that + /// is actually instantiated. Values of this enumeration are kept in the + /// BreakpointResolver's SubclassID field. They are used for concrete type + /// identification. + enum ResolverTy { + FileLineResolver = 0, // This is an instance of BreakpointResolverFileLine + AddressResolver, // This is an instance of BreakpointResolverAddress + NameResolver, // This is an instance of BreakpointResolverName + FileRegexResolver, + ExceptionResolver, + LastKnownResolverType = ExceptionResolver, + UnknownResolver + }; + + // Translate the Ty to name for serialization, + // the "+2" is one for size vrs. index, and one for UnknownResolver. + static const char *g_ty_to_name[LastKnownResolverType + 2]; + + //------------------------------------------------------------------ + /// getResolverID - Return an ID for the concrete type of this object. This + /// is used to implement the LLVM classof checks. This should not be used + /// for any other purpose, as the values may change as LLDB evolves. + unsigned getResolverID() const { return SubclassID; } + + enum ResolverTy GetResolverTy() { + if (SubclassID > ResolverTy::LastKnownResolverType) + return ResolverTy::UnknownResolver; + else + return (enum ResolverTy)SubclassID; + } + + const char *GetResolverName() { return ResolverTyToName(GetResolverTy()); } + + static const char *ResolverTyToName(enum ResolverTy); + + static ResolverTy NameToResolverTy(const char *name); + + virtual lldb::BreakpointResolverSP + CopyForBreakpoint(Breakpoint &breakpoint) = 0; protected: - //------------------------------------------------------------------ - /// SetSCMatchesByLine - Takes a symbol context list of matches which supposedly represent the same file and - /// line number in a CU, and find the nearest actual line number that matches, and then filter down the - /// matching addresses to unique entries, and skip the prologue if asked to do so, and then set - /// breakpoint locations in this breakpoint for all the resultant addresses. - void SetSCMatchesByLine (SearchFilter &filter, SymbolContextList &sc_list, bool skip_prologue, const char *log_ident); - - lldb::BreakpointLocationSP - AddLocation(Address loc_addr, bool *new_location = NULL); - - Breakpoint *m_breakpoint; // This is the breakpoint we add locations to. - lldb::addr_t m_offset; // A random offset the user asked us to add to any breakpoints we set. + // Used for serializing resolver options: + // The options in this enum and the strings in the + // g_option_names must be kept in sync. + enum class OptionNames : uint32_t { + AddressOffset = 0, + ExactMatch, + FileName, + Inlines, + LanguageName, + LineNumber, + ModuleName, + NameMaskArray, + Offset, + RegexString, + SectionName, + SkipPrologue, + SymbolNameArray, + LastOptionName + }; + static const char + *g_option_names[static_cast<uint32_t>(OptionNames::LastOptionName)]; + +public: + static const char *GetKey(OptionNames enum_value) { + return g_option_names[static_cast<uint32_t>(enum_value)]; + } + +protected: + //------------------------------------------------------------------ + /// SetSCMatchesByLine - Takes a symbol context list of matches which + /// supposedly represent the same file and + /// line number in a CU, and find the nearest actual line number that matches, + /// and then filter down the + /// matching addresses to unique entries, and skip the prologue if asked to do + /// so, and then set + /// breakpoint locations in this breakpoint for all the resultant addresses. + void SetSCMatchesByLine(SearchFilter &filter, SymbolContextList &sc_list, + bool skip_prologue, llvm::StringRef log_ident); + void SetSCMatchesByLine(SearchFilter &, SymbolContextList &, bool, + const char *) = delete; + + lldb::BreakpointLocationSP AddLocation(Address loc_addr, + bool *new_location = NULL); + + Breakpoint *m_breakpoint; // This is the breakpoint we add locations to. + lldb::addr_t m_offset; // A random offset the user asked us to add to any + // breakpoints we set. private: - // Subclass identifier (for llvm isa/dyn_cast) - const unsigned char SubclassID; - DISALLOW_COPY_AND_ASSIGN(BreakpointResolver); + // Subclass identifier (for llvm isa/dyn_cast) + const unsigned char SubclassID; + DISALLOW_COPY_AND_ASSIGN(BreakpointResolver); }; } // namespace lldb_private |