193f50594SJonas Devlieghere##===-- breakwin.py ------------------------------------------*- Python -*-===## 293f50594SJonas Devlieghere## 393f50594SJonas Devlieghere# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 493f50594SJonas Devlieghere# See https://llvm.org/LICENSE.txt for license information. 593f50594SJonas Devlieghere# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 693f50594SJonas Devlieghere## 793f50594SJonas Devlieghere##===----------------------------------------------------------------------===## 893f50594SJonas Devlieghere 993f50594SJonas Devlieghereimport cui 1093f50594SJonas Devlieghereimport curses 1193f50594SJonas Devlieghereimport lldb 1293f50594SJonas Devlieghereimport lldbutil 1393f50594SJonas Devlieghereimport re 1493f50594SJonas Devlieghere 1593f50594SJonas Devlieghere 1693f50594SJonas Devlieghereclass BreakWin(cui.ListWin): 1793f50594SJonas Devlieghere def __init__(self, driver, x, y, w, h): 1893f50594SJonas Devlieghere super(BreakWin, self).__init__(x, y, w, h) 1993f50594SJonas Devlieghere self.driver = driver 2093f50594SJonas Devlieghere self.update() 2193f50594SJonas Devlieghere self.showDetails = {} 2293f50594SJonas Devlieghere 2393f50594SJonas Devlieghere def handleEvent(self, event): 2493f50594SJonas Devlieghere if isinstance(event, lldb.SBEvent): 2593f50594SJonas Devlieghere if lldb.SBBreakpoint.EventIsBreakpointEvent(event): 2693f50594SJonas Devlieghere self.update() 2793f50594SJonas Devlieghere if isinstance(event, int): 28*602e47c5SDavid Spickett if event == ord("d"): 2993f50594SJonas Devlieghere self.deleteSelected() 3093f50594SJonas Devlieghere if event == curses.ascii.NL or event == curses.ascii.SP: 3193f50594SJonas Devlieghere self.toggleSelected() 3293f50594SJonas Devlieghere elif event == curses.ascii.TAB: 3393f50594SJonas Devlieghere if self.getSelected() != -1: 3493f50594SJonas Devlieghere target = self.driver.getTarget() 3593f50594SJonas Devlieghere if not target.IsValid(): 3693f50594SJonas Devlieghere return 3793f50594SJonas Devlieghere i = target.GetBreakpointAtIndex(self.getSelected()).id 3893f50594SJonas Devlieghere self.showDetails[i] = not self.showDetails[i] 3993f50594SJonas Devlieghere self.update() 4093f50594SJonas Devlieghere super(BreakWin, self).handleEvent(event) 4193f50594SJonas Devlieghere 4293f50594SJonas Devlieghere def toggleSelected(self): 4393f50594SJonas Devlieghere if self.getSelected() == -1: 4493f50594SJonas Devlieghere return 4593f50594SJonas Devlieghere target = self.driver.getTarget() 4693f50594SJonas Devlieghere if not target.IsValid(): 4793f50594SJonas Devlieghere return 4893f50594SJonas Devlieghere bp = target.GetBreakpointAtIndex(self.getSelected()) 4993f50594SJonas Devlieghere bp.SetEnabled(not bp.IsEnabled()) 5093f50594SJonas Devlieghere 5193f50594SJonas Devlieghere def deleteSelected(self): 5293f50594SJonas Devlieghere if self.getSelected() == -1: 5393f50594SJonas Devlieghere return 5493f50594SJonas Devlieghere target = self.driver.getTarget() 5593f50594SJonas Devlieghere if not target.IsValid(): 5693f50594SJonas Devlieghere return 5793f50594SJonas Devlieghere bp = target.GetBreakpointAtIndex(self.getSelected()) 5893f50594SJonas Devlieghere target.BreakpointDelete(bp.id) 5993f50594SJonas Devlieghere 6093f50594SJonas Devlieghere def update(self): 6193f50594SJonas Devlieghere target = self.driver.getTarget() 6293f50594SJonas Devlieghere if not target.IsValid(): 6393f50594SJonas Devlieghere self.win.erase() 6493f50594SJonas Devlieghere self.win.noutrefresh() 6593f50594SJonas Devlieghere return 6693f50594SJonas Devlieghere selected = self.getSelected() 6793f50594SJonas Devlieghere self.clearItems() 6893f50594SJonas Devlieghere for i in range(0, target.GetNumBreakpoints()): 6993f50594SJonas Devlieghere bp = target.GetBreakpointAtIndex(i) 7093f50594SJonas Devlieghere if bp.IsInternal(): 7193f50594SJonas Devlieghere continue 7293f50594SJonas Devlieghere text = lldbutil.get_description(bp) 7393f50594SJonas Devlieghere # FIXME: Use an API for this, not parsing the description. 74*602e47c5SDavid Spickett match = re.search("SBBreakpoint: id = ([^,]+), (.*)", text) 7593f50594SJonas Devlieghere try: 7693f50594SJonas Devlieghere id = match.group(1) 7793f50594SJonas Devlieghere desc = match.group(2).strip() 7893f50594SJonas Devlieghere if bp.IsEnabled(): 79*602e47c5SDavid Spickett text = "%s: %s" % (id, desc) 8093f50594SJonas Devlieghere else: 81*602e47c5SDavid Spickett text = "%s: (disabled) %s" % (id, desc) 8293f50594SJonas Devlieghere except ValueError as e: 8393f50594SJonas Devlieghere # bp unparsable 8493f50594SJonas Devlieghere pass 8593f50594SJonas Devlieghere 8693f50594SJonas Devlieghere if self.showDetails.setdefault(bp.id, False): 8793f50594SJonas Devlieghere for location in bp: 8893f50594SJonas Devlieghere desc = lldbutil.get_description( 89*602e47c5SDavid Spickett location, lldb.eDescriptionLevelFull 90*602e47c5SDavid Spickett ) 91*602e47c5SDavid Spickett text += "\n " + desc 9293f50594SJonas Devlieghere self.addItem(text) 9393f50594SJonas Devlieghere self.setSelected(selected) 94