[Lldb-commits] [lldb] r342190 - svn add the new files...

Davide Italiano via lldb-commits lldb-commits at lists.llvm.org
Thu Sep 13 15:05:02 PDT 2018


Thank you!
On Thu, Sep 13, 2018 at 3:00 PM Jim Ingham via lldb-commits
<lldb-commits at lists.llvm.org> wrote:
>
> Author: jingham
> Date: Thu Sep 13 14:59:16 2018
> New Revision: 342190
>
> URL: http://llvm.org/viewvc/llvm-project?rev=342190&view=rev
> Log:
> svn add the new files...
>
> I started from a clean slate to do the checkin, but forgot to svn add the new files.
> Do that now.
>
> Also add the one new source file to CMakeLists.txt
>
>
> Added:
>     lldb/trunk/include/lldb/Breakpoint/BreakpointResolverScripted.h
>     lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/
>     lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/Makefile
>     lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/TestScriptedResolver.py
>     lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/main.c
>     lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/resolver.py
>     lldb/trunk/source/Breakpoint/BreakpointResolverScripted.cpp
> Modified:
>     lldb/trunk/source/Breakpoint/CMakeLists.txt
>
> Added: lldb/trunk/include/lldb/Breakpoint/BreakpointResolverScripted.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Breakpoint/BreakpointResolverScripted.h?rev=342190&view=auto
> ==============================================================================
> --- lldb/trunk/include/lldb/Breakpoint/BreakpointResolverScripted.h (added)
> +++ lldb/trunk/include/lldb/Breakpoint/BreakpointResolverScripted.h Thu Sep 13 14:59:16 2018
> @@ -0,0 +1,85 @@
> +//===-- BreakpointResolverScripted.h -----------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef liblldb_BreakpointResolverScripted_h_
> +#define liblldb_BreakpointResolverScripted_h_
> +
> +// C Includes
> +// C++ Includes
> +// Other libraries and framework includes
> +// Project includes
> +#include "lldb/lldb-forward.h"
> +#include "lldb/Breakpoint/BreakpointResolver.h"
> +#include "lldb/Core/ModuleSpec.h"
> +
> +
> +namespace lldb_private {
> +
> +//----------------------------------------------------------------------
> +/// @class BreakpointResolverScripted BreakpointResolverScripted.h
> +/// "lldb/Breakpoint/BreakpointResolverScripted.h" This class sets breakpoints
> +/// on a given Address.  This breakpoint only takes once, and then it won't
> +/// attempt to reset itself.
> +//----------------------------------------------------------------------
> +
> +class BreakpointResolverScripted : public BreakpointResolver {
> +public:
> +  BreakpointResolverScripted(Breakpoint *bkpt,
> +                             const llvm::StringRef class_name,
> +                             lldb::SearchDepth depth,
> +                             StructuredDataImpl *args_data,
> +                             ScriptInterpreter &script_interp);
> +
> +  ~BreakpointResolverScripted() override;
> +
> +  static BreakpointResolver *
> +  CreateFromStructuredData(Breakpoint *bkpt,
> +                           const StructuredData::Dictionary &options_dict,
> +                           Status &error);
> +
> +  StructuredData::ObjectSP SerializeToStructuredData() override;
> +
> +  Searcher::CallbackReturn SearchCallback(SearchFilter &filter,
> +                                          SymbolContext &context, Address *addr,
> +                                          bool containing) override;
> +
> +  lldb::SearchDepth GetDepth() override;
> +
> +  void GetDescription(Stream *s) override;
> +
> +  void Dump(Stream *s) const override;
> +
> +  /// Methods for support type inquiry through isa, cast, and dyn_cast:
> +  static inline bool classof(const BreakpointResolverScripted *) { return true; }
> +  static inline bool classof(const BreakpointResolver *V) {
> +    return V->getResolverID() == BreakpointResolver::PythonResolver;
> +  }
> +
> +  lldb::BreakpointResolverSP CopyForBreakpoint(Breakpoint &breakpoint) override;
> +
> +protected:
> +  void NotifyBreakpointSet() override;
> +private:
> +  void CreateImplementationIfNeeded();
> +  ScriptInterpreter *GetScriptInterpreter();
> +
> +  std::string m_class_name;
> +  lldb::SearchDepth m_depth;
> +  StructuredDataImpl *m_args_ptr; // We own this, but the implementation
> +                                  // has to manage the UP (since that is
> +                                  // how it gets stored in the
> +                                  // SBStructuredData).
> +  StructuredData::GenericSP m_implementation_sp;
> +
> +  DISALLOW_COPY_AND_ASSIGN(BreakpointResolverScripted);
> +};
> +
> +} // namespace lldb_private
> +
> +#endif // liblldb_BreakpointResolverScripted_h_
>
> Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/Makefile
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/Makefile?rev=342190&view=auto
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/Makefile (added)
> +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/Makefile Thu Sep 13 14:59:16 2018
> @@ -0,0 +1,6 @@
> +LEVEL = ../../../make
> +
> +C_SOURCES := main.c
> +CFLAGS_EXTRAS += -std=c99
> +
> +include $(LEVEL)/Makefile.rules
>
> Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/TestScriptedResolver.py
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/TestScriptedResolver.py?rev=342190&view=auto
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/TestScriptedResolver.py (added)
> +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/TestScriptedResolver.py Thu Sep 13 14:59:16 2018
> @@ -0,0 +1,171 @@
> +"""
> +Test setting breakpoints using a scripted resolver
> +"""
> +
> +from __future__ import print_function
> +
> +
> +import os
> +import time
> +import re
> +import lldb
> +import lldbsuite.test.lldbutil as lldbutil
> +from lldbsuite.test.lldbtest import *
> +
> +
> +class TestScriptedResolver(TestBase):
> +
> +    mydir = TestBase.compute_mydir(__file__)
> +
> +    NO_DEBUG_INFO_TESTCASE = True
> +
> +    def test_scripted_resolver(self):
> +        """Use a scripted resolver to set a by symbol name breakpoint"""
> +        self.build()
> +        self.do_test()
> +
> +    def test_search_depths(self):
> +        """ Make sure we are called at the right depths depending on what we return
> +            from __get_depth__"""
> +        self.build()
> +        self.do_test_depths()
> +
> +    def test_command_line(self):
> +        """ Make sure we are called at the right depths depending on what we return
> +            from __get_depth__"""
> +        self.build()
> +        self.do_test_cli()
> +
> +    def setUp(self):
> +        # Call super's setUp().
> +        TestBase.setUp(self)
> +
> +    def make_target_and_import(self):
> +        target = lldbutil.run_to_breakpoint_make_target(self)
> +        interp = self.dbg.GetCommandInterpreter()
> +        error = lldb.SBError()
> +
> +        script_name = os.path.join(self.getSourceDir(), "resolver.py")
> +        source_name = os.path.join(self.getSourceDir(), "main.c")
> +
> +        command = "command script import " + script_name
> +        result = lldb.SBCommandReturnObject()
> +        interp.HandleCommand(command, result)
> +        self.assertTrue(result.Succeeded(), "com scr imp failed: %s"%(result.GetError()))
> +        return target
> +
> +    def make_extra_args(self):
> +        json_string = '{"symbol":"break_on_me", "test1": "value1"}'
> +        json_stream = lldb.SBStream()
> +        json_stream.Print(json_string)
> +        extra_args = lldb.SBStructuredData()
> +        error = extra_args.SetFromJSON(json_stream)
> +        self.assertTrue(error.Success(), "Error making SBStructuredData: %s"%(error.GetCString()))
> +        return extra_args
> +
> +    def do_test(self):
> +        """This reads in a python file and sets a breakpoint using it."""
> +
> +        target = self.make_target_and_import()
> +        extra_args = self.make_extra_args()
> +
> +        file_list = lldb.SBFileSpecList()
> +        module_list = lldb.SBFileSpecList()
> +
> +        # Make breakpoints with this resolver using different filters, first ones that will take:
> +        right = []
> +        # one with no file or module spec - this one should fire:
> +        right.append(target.BreakpointCreateFromScript("resolver.Resolver", extra_args, module_list, file_list))
> +
> +        # one with the right source file and no module - should also fire:
> +        file_list.Append(lldb.SBFileSpec("main.c"))
> +        right.append(target.BreakpointCreateFromScript("resolver.Resolver", extra_args, module_list, file_list))
> +        # Make sure the help text shows up in the "break list" output:
> +        self.expect("break list", substrs=["I am a python breakpoint resolver"], msg="Help is listed in break list")
> +
> +        # one with the right source file and right module - should also fire:
> +        module_list.Append(lldb.SBFileSpec("a.out"))
> +        right.append(target.BreakpointCreateFromScript("resolver.Resolver", extra_args, module_list, file_list))
> +
> +        # And one with no source file but the right module:
> +        file_list.Clear()
> +        right.append(target.BreakpointCreateFromScript("resolver.Resolver", extra_args, module_list, file_list))
> +
> +        # Make sure these all got locations:
> +        for i in range (0, len(right)):
> +            self.assertTrue(right[i].GetNumLocations() >= 1, "Breakpoint %d has no locations."%(i))
> +
> +        # Now some ones that won't take:
> +
> +        module_list.Clear()
> +        file_list.Clear()
> +        wrong = []
> +
> +        # one with the wrong module - should not fire:
> +        module_list.Append(lldb.SBFileSpec("noSuchModule"))
> +        wrong.append(target.BreakpointCreateFromScript("resolver.Resolver", extra_args, module_list, file_list))
> +
> +        # one with the wrong file - also should not fire:
> +        module_list.Clear()
> +        file_list.Append(lldb.SBFileSpec("noFileOfThisName.xxx"))
> +        wrong.append(target.BreakpointCreateFromScript("resolver.Resolver", extra_args, module_list, file_list))
> +
> +        # Make sure these didn't get locations:
> +        for i in range(0, len(wrong)):
> +            self.assertEqual(wrong[i].GetNumLocations(), 0, "Breakpoint %d has locations."%(i))
> +
> +        # Now run to main and ensure we hit the breakpoints we should have:
> +
> +        lldbutil.run_to_breakpoint_do_run(self, target, right[0])
> +
> +        # Test the hit counts:
> +        for i in range(0, len(right)):
> +            self.assertEqual(right[i].GetHitCount(), 1, "Breakpoint %d has the wrong hit count"%(i))
> +
> +        for i in range(0, len(wrong)):
> +            self.assertEqual(wrong[i].GetHitCount(), 0, "Breakpoint %d has the wrong hit count"%(i))
> +
> +    def do_test_depths(self):
> +        """This test uses a class variable in resolver.Resolver which gets set to 1 if we saw
> +           compile unit and 2 if we only saw modules.  If the search depth is module, you get passed just
> +           the modules with no comp_unit.  If the depth is comp_unit you get comp_units.  So we can use
> +           this to test that our callback gets called at the right depth."""
> +
> +        target = self.make_target_and_import()
> +        extra_args = self.make_extra_args()
> +
> +        file_list = lldb.SBFileSpecList()
> +        module_list = lldb.SBFileSpecList()
> +        module_list.Append(lldb.SBFileSpec("a.out"))
> +
> +        # Make a breakpoint that has no __get_depth__, check that that is converted to eSearchDepthModule:
> +        bkpt = target.BreakpointCreateFromScript("resolver.Resolver", extra_args, module_list, file_list)
> +        self.assertTrue(bkpt.GetNumLocations() > 0, "Resolver got no locations.")
> +        self.expect("script print resolver.Resolver.got_files", substrs=["2"], msg="Was only passed modules")
> +
> +        # Make a breakpoint that asks for modules, check that we didn't get any files:
> +        bkpt = target.BreakpointCreateFromScript("resolver.ResolverModuleDepth", extra_args, module_list, file_list)
> +        self.assertTrue(bkpt.GetNumLocations() > 0, "ResolverModuleDepth got no locations.")
> +        self.expect("script print resolver.Resolver.got_files", substrs=["2"], msg="Was only passed modules")
> +
> +        # Make a breakpoint that asks for compile units, check that we didn't get any files:
> +        bkpt = target.BreakpointCreateFromScript("resolver.ResolverCUDepth", extra_args, module_list, file_list)
> +        self.assertTrue(bkpt.GetNumLocations() > 0, "ResolverCUDepth got no locations.")
> +        self.expect("script print resolver.Resolver.got_files", substrs=["1"], msg="Was passed compile units")
> +
> +        # Make a breakpoint that returns a bad value - we should convert that to "modules" so check that:
> +        bkpt = target.BreakpointCreateFromScript("resolver.ResolverBadDepth", extra_args, module_list, file_list)
> +        self.assertTrue(bkpt.GetNumLocations() > 0, "ResolverBadDepth got no locations.")
> +        self.expect("script print resolver.Resolver.got_files", substrs=["2"], msg="Was only passed modules")
> +
> +        # Make a breakpoint that searches at function depth - FIXME: uncomment this when I fix the function
> +        # depth search.
> +        #bkpt = target.BreakpointCreateFromScript("resolver.ResolverFuncDepth", extra_args, module_list, file_list)
> +        #self.assertTrue(bkpt.GetNumLocations() > 0, "ResolverFuncDepth got no locations.")
> +        #self.expect("script print resolver.Resolver.got_files", substrs=["3"], msg="Was only passed modules")
> +        #self.expect("script print resolver.Resolver.func_list", substrs=["break_on_me", "main", "test_func"], msg="Saw all the functions")
> +
> +    def do_test_cli(self):
> +        target = self.make_target_and_import()
> +
> +        lldbutil.run_break_set_by_script(self, "resolver.Resolver", extra_options="-k symbol -v break_on_me")
>
> Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/main.c
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/main.c?rev=342190&view=auto
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/main.c (added)
> +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/main.c Thu Sep 13 14:59:16 2018
> @@ -0,0 +1,21 @@
> +#include <stdio.h>
> +
> +int
> +test_func()
> +{
> +  return printf("I am a test function.");
> +}
> +
> +void
> +break_on_me()
> +{
> +  printf("I was called.\n");
> +}
> +
> +int
> +main()
> +{
> +  break_on_me();
> +  test_func();
> +  return 0;
> +}
>
> Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/resolver.py
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/resolver.py?rev=342190&view=auto
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/resolver.py (added)
> +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/scripted_bkpt/resolver.py Thu Sep 13 14:59:16 2018
> @@ -0,0 +1,55 @@
> +import lldb
> +
> +class Resolver:
> +  got_files = 0
> +  func_list = []
> +
> +  def __init__(self, bkpt, extra_args, dict):
> +      self.bkpt = bkpt
> +      self.extra_args = extra_args
> +      Resolver.func_list = []
> +      Resolver.got_files = 0
> +
> +  def __callback__(self, sym_ctx):
> +      sym_name = "not_a_real_function_name"
> +      sym_item = self.extra_args.GetValueForKey("symbol")
> +      if sym_item.IsValid():
> +          sym_name = sym_item.GetStringValue(1000)
> +
> +      if sym_ctx.compile_unit.IsValid():
> +          Resolver.got_files = 1
> +      else:
> +          Resolver.got_files = 2
> +
> +      if sym_ctx.function.IsValid():
> +        Resolver.got_files = 3
> +        func_name = sym_ctx.function.GetName()
> +        print("got called with: ", func_name)
> +        Resolver.func_list.append(func_name)
> +        if sym_name == func_name:
> +          self.bkpt.AddLocations(func.GetStartAddress())
> +        return
> +
> +      if sym_ctx.module.IsValid():
> +          sym = sym_ctx.module.FindSymbol(sym_name, lldb.eSymbolTypeCode)
> +          if sym.IsValid():
> +              self.bkpt.AddLocation(sym.GetStartAddress())
> +
> +  def get_short_help(self):
> +      return "I am a python breakpoint resolver"
> +
> +class ResolverModuleDepth(Resolver):
> +    def __get_depth__ (self):
> +        return lldb.eSearchDepthModule
> +
> +class ResolverCUDepth(Resolver):
> +    def __get_depth__ (self):
> +        return lldb.eSearchDepthCompUnit
> +
> +class ResolverFuncDepth(Resolver):
> +    def __get_depth__ (self):
> +        return lldb.eSearchDepthFunction
> +
> +class ResolverBadDepth(Resolver):
> +    def __get_depth__ (self):
> +        return lldb.kLastSearchDepthKind + 1
>
> Added: lldb/trunk/source/Breakpoint/BreakpointResolverScripted.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Breakpoint/BreakpointResolverScripted.cpp?rev=342190&view=auto
> ==============================================================================
> --- lldb/trunk/source/Breakpoint/BreakpointResolverScripted.cpp (added)
> +++ lldb/trunk/source/Breakpoint/BreakpointResolverScripted.cpp Thu Sep 13 14:59:16 2018
> @@ -0,0 +1,193 @@
> +//===-- BreakpointResolverScripted.cpp ---------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "lldb/Breakpoint/BreakpointResolverScripted.h"
> +
> +// C Includes
> +// C++ Includes
> +// Other libraries and framework includes
> +// Project includes
> +
> +#include "lldb/Breakpoint/BreakpointLocation.h"
> +#include "lldb/Core/Debugger.h"
> +#include "lldb/Core/Module.h"
> +#include "lldb/Core/Section.h"
> +#include "lldb/Core/StructuredDataImpl.h"
> +#include "lldb/Interpreter/CommandInterpreter.h"
> +#include "lldb/Interpreter/ScriptInterpreter.h"
> +#include "lldb/Target/Process.h"
> +#include "lldb/Target/Target.h"
> +#include "lldb/Utility/Log.h"
> +#include "lldb/Utility/StreamString.h"
> +
> +using namespace lldb;
> +using namespace lldb_private;
> +
> +//----------------------------------------------------------------------
> +// BreakpointResolverScripted:
> +//----------------------------------------------------------------------
> +BreakpointResolverScripted::BreakpointResolverScripted(
> +    Breakpoint *bkpt,
> +    const llvm::StringRef class_name,
> +    lldb::SearchDepth depth,
> +    StructuredDataImpl *args_data,
> +    ScriptInterpreter &script_interp)
> +    : BreakpointResolver(bkpt, BreakpointResolver::PythonResolver),
> +      m_class_name(class_name), m_depth(depth), m_args_ptr(args_data) {
> +  CreateImplementationIfNeeded();
> +}
> +
> +void BreakpointResolverScripted::CreateImplementationIfNeeded() {
> +  if (m_implementation_sp)
> +    return;
> +
> +  if (m_class_name.empty())
> +    return;
> +
> +  if (m_breakpoint) {
> +    TargetSP target_sp = m_breakpoint->GetTargetSP();
> +    ScriptInterpreter *script_interp = target_sp->GetDebugger()
> +                                                .GetCommandInterpreter()
> +                                                .GetScriptInterpreter();
> +    if (!script_interp)
> +      return;
> +    lldb::BreakpointSP bkpt_sp(m_breakpoint->shared_from_this());
> +    m_implementation_sp = script_interp->CreateScriptedBreakpointResolver(
> +        m_class_name.c_str(), m_args_ptr, bkpt_sp);
> +  }
> +}
> +
> +void BreakpointResolverScripted::NotifyBreakpointSet() {
> +  CreateImplementationIfNeeded();
> +}
> +
> +BreakpointResolverScripted::~BreakpointResolverScripted() {}
> +
> +BreakpointResolver *
> +BreakpointResolverScripted::CreateFromStructuredData(
> +    Breakpoint *bkpt, const StructuredData::Dictionary &options_dict,
> +    Status &error) {
> +  llvm::StringRef class_name;
> +  bool success;
> +
> +  if (!bkpt)
> +    return nullptr;
> +
> +  success = options_dict.GetValueForKeyAsString(
> +      GetKey(OptionNames::PythonClassName), class_name);
> +  if (!success) {
> +    error.SetErrorString("BRFL::CFSD: Couldn't find class name entry.");
> +    return nullptr;
> +  }
> +  lldb::SearchDepth depth;
> +  int depth_as_int;
> +  success = options_dict.GetValueForKeyAsInteger(
> +      GetKey(OptionNames::SearchDepth), depth_as_int);
> +  if (!success) {
> +    error.SetErrorString("BRFL::CFSD: Couldn't find class name entry.");
> +    return nullptr;
> +  }
> +  if (depth_as_int >= (int) OptionNames::LastOptionName) {
> +    error.SetErrorString("BRFL::CFSD: Invalid value for search depth.");
> +    return nullptr;
> +  }
> +  depth = (lldb::SearchDepth) depth_as_int;
> +
> +  StructuredDataImpl *args_data_impl = new StructuredDataImpl();
> +  StructuredData::Dictionary *args_dict = new StructuredData::Dictionary();
> +  success = options_dict.GetValueForKeyAsDictionary(
> +    GetKey(OptionNames::ScriptArgs), args_dict);
> +  if (success) {
> +    // FIXME: The resolver needs a copy of the ARGS dict that it can own,
> +    // so I need to make a copy constructor for the Dictionary so I can pass
> +    // that to it here.  For now the args are empty.
> +    //StructuredData::Dictionary *dict_copy = new StructuredData::Dictionary(args_dict);
> +
> +  }
> +  ScriptInterpreter *script_interp = bkpt->GetTarget()
> +                                         .GetDebugger()
> +                                         .GetCommandInterpreter()
> +                                         .GetScriptInterpreter();
> +  return new BreakpointResolverScripted(bkpt, class_name, depth, args_data_impl,
> +                                      *script_interp);
> +}
> +
> +StructuredData::ObjectSP
> +BreakpointResolverScripted::SerializeToStructuredData() {
> +  StructuredData::DictionarySP options_dict_sp(
> +      new StructuredData::Dictionary());
> +
> +  options_dict_sp->AddStringItem(GetKey(OptionNames::PythonClassName),
> +                                   m_class_name);
> +  return WrapOptionsDict(options_dict_sp);
> +}
> +
> +ScriptInterpreter *BreakpointResolverScripted::GetScriptInterpreter() {
> +    return m_breakpoint->GetTarget().GetDebugger().GetCommandInterpreter()
> +        .GetScriptInterpreter();
> +}
> +
> +Searcher::CallbackReturn
> +BreakpointResolverScripted::SearchCallback(SearchFilter &filter,
> +                                          SymbolContext &context, Address *addr,
> +                                          bool containing) {
> +  assert(m_breakpoint != NULL);
> +  bool should_continue = true;
> +  if (!m_implementation_sp)
> +    return Searcher::eCallbackReturnStop;
> +
> +  ScriptInterpreter *interp = GetScriptInterpreter();
> +  should_continue = interp->ScriptedBreakpointResolverSearchCallback(
> +      m_implementation_sp,
> +      &context);
> +  if (should_continue)
> +    return Searcher::eCallbackReturnContinue;
> +  else
> +    return Searcher::eCallbackReturnStop;
> +}
> +
> +lldb::SearchDepth
> +BreakpointResolverScripted::GetDepth() {
> +  assert(m_breakpoint != NULL);
> +  lldb::SearchDepth depth = lldb::eSearchDepthModule;
> +  if (m_implementation_sp) {
> +    ScriptInterpreter *interp = GetScriptInterpreter();
> +    depth = interp->ScriptedBreakpointResolverSearchDepth(
> +        m_implementation_sp);
> +  }
> +  return depth;
> +}
> +
> +void BreakpointResolverScripted::GetDescription(Stream *s) {
> +  StructuredData::GenericSP generic_sp;
> +  std::string short_help;
> +
> +  if (m_implementation_sp) {
> +    ScriptInterpreter *interp = GetScriptInterpreter();
> +    interp->GetShortHelpForCommandObject(m_implementation_sp,
> +                                         short_help);
> +  }
> +  if (!short_help.empty())
> +    s->PutCString(short_help.c_str());
> +  else
> +    s->Printf("python class = %s", m_class_name.c_str());
> +}
> +
> +void BreakpointResolverScripted::Dump(Stream *s) const {}
> +
> +lldb::BreakpointResolverSP
> +BreakpointResolverScripted::CopyForBreakpoint(Breakpoint &breakpoint) {
> +  ScriptInterpreter *script_interp = GetScriptInterpreter();
> +  // FIXME: Have to make a copy of the arguments from the m_args_ptr and then
> +  // pass that to the new resolver.
> +  lldb::BreakpointResolverSP ret_sp(
> +      new BreakpointResolverScripted(&breakpoint, m_class_name,
> +                                   m_depth, nullptr, *script_interp));
> +  return ret_sp;
> +}
>
> Modified: lldb/trunk/source/Breakpoint/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Breakpoint/CMakeLists.txt?rev=342190&r1=342189&r2=342190&view=diff
> ==============================================================================
> --- lldb/trunk/source/Breakpoint/CMakeLists.txt (original)
> +++ lldb/trunk/source/Breakpoint/CMakeLists.txt Thu Sep 13 14:59:16 2018
> @@ -13,6 +13,7 @@ add_lldb_library(lldbBreakpoint
>    BreakpointResolverFileLine.cpp
>    BreakpointResolverFileRegex.cpp
>    BreakpointResolverName.cpp
> +  BreakpointResolverScripted.cpp
>    BreakpointSite.cpp
>    BreakpointSiteList.cpp
>    Stoppoint.cpp
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


More information about the lldb-commits mailing list