1*99451b44SJordan Rupprechtimport lldb
2*99451b44SJordan Rupprecht
3*99451b44SJordan Rupprechtclass Resolver:
4*99451b44SJordan Rupprecht  got_files = 0
5*99451b44SJordan Rupprecht  func_list = []
6*99451b44SJordan Rupprecht
7*99451b44SJordan Rupprecht  def __init__(self, bkpt, extra_args, dict):
8*99451b44SJordan Rupprecht      self.bkpt = bkpt
9*99451b44SJordan Rupprecht      self.extra_args = extra_args
10*99451b44SJordan Rupprecht
11*99451b44SJordan Rupprecht      Resolver.func_list = []
12*99451b44SJordan Rupprecht      Resolver.got_files = 0
13*99451b44SJordan Rupprecht
14*99451b44SJordan Rupprecht  def __callback__(self, sym_ctx):
15*99451b44SJordan Rupprecht      sym_name = "not_a_real_function_name"
16*99451b44SJordan Rupprecht      sym_item = self.extra_args.GetValueForKey("symbol")
17*99451b44SJordan Rupprecht      if sym_item.IsValid():
18*99451b44SJordan Rupprecht          sym_name = sym_item.GetStringValue(1000)
19*99451b44SJordan Rupprecht      else:
20*99451b44SJordan Rupprecht          print("Didn't have a value for key 'symbol'")
21*99451b44SJordan Rupprecht
22*99451b44SJordan Rupprecht      if sym_ctx.compile_unit.IsValid():
23*99451b44SJordan Rupprecht          Resolver.got_files = 1
24*99451b44SJordan Rupprecht      else:
25*99451b44SJordan Rupprecht          Resolver.got_files = 2
26*99451b44SJordan Rupprecht
27*99451b44SJordan Rupprecht      if sym_ctx.function.IsValid():
28*99451b44SJordan Rupprecht        Resolver.got_files = 3
29*99451b44SJordan Rupprecht        func_name = sym_ctx.function.GetName()
30*99451b44SJordan Rupprecht        Resolver.func_list.append(func_name)
31*99451b44SJordan Rupprecht        if sym_name == func_name:
32*99451b44SJordan Rupprecht          self.bkpt.AddLocation(sym_ctx.function.GetStartAddress())
33*99451b44SJordan Rupprecht        return
34*99451b44SJordan Rupprecht
35*99451b44SJordan Rupprecht      if sym_ctx.module.IsValid():
36*99451b44SJordan Rupprecht          sym = sym_ctx.module.FindSymbol(sym_name, lldb.eSymbolTypeCode)
37*99451b44SJordan Rupprecht          if sym.IsValid():
38*99451b44SJordan Rupprecht              self.bkpt.AddLocation(sym.GetStartAddress())
39*99451b44SJordan Rupprecht
40*99451b44SJordan Rupprecht  def get_short_help(self):
41*99451b44SJordan Rupprecht      return "I am a python breakpoint resolver"
42*99451b44SJordan Rupprecht
43*99451b44SJordan Rupprechtclass ResolverModuleDepth(Resolver):
44*99451b44SJordan Rupprecht    def __get_depth__ (self):
45*99451b44SJordan Rupprecht        return lldb.eSearchDepthModule
46*99451b44SJordan Rupprecht
47*99451b44SJordan Rupprechtclass ResolverCUDepth(Resolver):
48*99451b44SJordan Rupprecht    def __get_depth__ (self):
49*99451b44SJordan Rupprecht        return lldb.eSearchDepthCompUnit
50*99451b44SJordan Rupprecht
51*99451b44SJordan Rupprechtclass ResolverFuncDepth(Resolver):
52*99451b44SJordan Rupprecht    def __get_depth__ (self):
53*99451b44SJordan Rupprecht        return lldb.eSearchDepthFunction
54*99451b44SJordan Rupprecht
55*99451b44SJordan Rupprechtclass ResolverBadDepth(Resolver):
56*99451b44SJordan Rupprecht    def __get_depth__ (self):
57*99451b44SJordan Rupprecht        return lldb.kLastSearchDepthKind + 1
58