13cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen//===-- SWIG Interface for SBBreakpoint -------------------------*- C++ -*-===// 23cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen// 33cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen// The LLVM Compiler Infrastructure 43cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen// 53cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen// This file is distributed under the University of Illinois Open Source 63cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen// License. See LICENSE.TXT for details. 73cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen// 83cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen//===----------------------------------------------------------------------===// 93cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 103cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chennamespace lldb { 113cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 123cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen%feature("docstring", 133cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen"Represents a logical breakpoint and its associated settings. 143cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 153cfd5e89ce6b66f271727032b36afb635287a24bJohnny ChenFor example (from test/functionalities/breakpoint/breakpoint_ignore_count/ 163cfd5e89ce6b66f271727032b36afb635287a24bJohnny ChenTestBreakpointIgnoreCount.py), 173cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 183cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen def breakpoint_ignore_count_python(self): 193cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen '''Use Python APIs to set breakpoint ignore count.''' 203cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen exe = os.path.join(os.getcwd(), 'a.out') 213cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 223cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen # Create a target by the debugger. 233cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen target = self.dbg.CreateTarget(exe) 243cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen self.assertTrue(target, VALID_TARGET) 253cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 263cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen # Now create a breakpoint on main.c by name 'c'. 273cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen breakpoint = target.BreakpointCreateByName('c', 'a.out') 283cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen self.assertTrue(breakpoint and 293cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen breakpoint.GetNumLocations() == 1, 303cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen VALID_BREAKPOINT) 313cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 323cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen # Get the breakpoint location from breakpoint after we verified that, 333cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen # indeed, it has one location. 343cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen location = breakpoint.GetLocationAtIndex(0) 353cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen self.assertTrue(location and 363cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen location.IsEnabled(), 373cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen VALID_BREAKPOINT_LOCATION) 383cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 393cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen # Set the ignore count on the breakpoint location. 403cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen location.SetIgnoreCount(2) 413cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen self.assertTrue(location.GetIgnoreCount() == 2, 423cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 'SetIgnoreCount() works correctly') 433cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 443cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen # Now launch the process, and do not stop at entry point. 453cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen process = target.LaunchSimple(None, None, os.getcwd()) 463cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen self.assertTrue(process, PROCESS_IS_VALID) 473cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 483cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen # Frame#0 should be on main.c:37, frame#1 should be on main.c:25, and 493cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen # frame#2 should be on main.c:48. 503cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen #lldbutil.print_stacktraces(process) 513cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen from lldbutil import get_stopped_thread 523cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint) 533cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen self.assertTrue(thread != None, 'There should be a thread stopped due to breakpoint') 543cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen frame0 = thread.GetFrameAtIndex(0) 553cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen frame1 = thread.GetFrameAtIndex(1) 563cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen frame2 = thread.GetFrameAtIndex(2) 573cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen self.assertTrue(frame0.GetLineEntry().GetLine() == self.line1 and 583cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen frame1.GetLineEntry().GetLine() == self.line3 and 593cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen frame2.GetLineEntry().GetLine() == self.line4, 603cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen STOPPED_DUE_TO_BREAKPOINT_IGNORE_COUNT) 613cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 623cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen # The hit count for the breakpoint should be 3. 633cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen self.assertTrue(breakpoint.GetHitCount() == 3) 643cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 653cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen process.Continue() 663cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 67fb35e2ad9893ca53f33eb3ce190147c02d97ec87Johnny ChenSBBreakpoint supports breakpoint location iteration, for example, 683cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 693cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen for bl in breakpoint: 703cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen print 'breakpoint location load addr: %s' % hex(bl.GetLoadAddress()) 713cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen print 'breakpoint location condition: %s' % hex(bl.GetCondition()) 72fb35e2ad9893ca53f33eb3ce190147c02d97ec87Johnny Chen 73fb35e2ad9893ca53f33eb3ce190147c02d97ec87Johnny Chenand rich comparion methods which allow the API program to use, 74fb35e2ad9893ca53f33eb3ce190147c02d97ec87Johnny Chen 75fb35e2ad9893ca53f33eb3ce190147c02d97ec87Johnny Chen if aBreakpoint == bBreakpoint: 76fb35e2ad9893ca53f33eb3ce190147c02d97ec87Johnny Chen ... 77fb35e2ad9893ca53f33eb3ce190147c02d97ec87Johnny Chen 78fb35e2ad9893ca53f33eb3ce190147c02d97ec87Johnny Chento compare two breakpoints for equality." 79fb35e2ad9893ca53f33eb3ce190147c02d97ec87Johnny Chen) SBBreakpoint; 803cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chenclass SBBreakpoint 813cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen{ 823cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chenpublic: 833cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 843cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen typedef bool (*BreakpointHitCallback) (void *baton, 853cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen SBProcess &process, 863cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen SBThread &thread, 873cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen lldb::SBBreakpointLocation &location); 883cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 893cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen SBBreakpoint (); 903cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 913cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen SBBreakpoint (const lldb::SBBreakpoint& rhs); 923cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 933cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen ~SBBreakpoint(); 943cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 953cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen break_id_t 963cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen GetID () const; 973cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 983cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen bool 993cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen IsValid() const; 1003cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1013cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen void 1023cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen ClearAllBreakpointSites (); 1033cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1043cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen lldb::SBBreakpointLocation 1053cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen FindLocationByAddress (lldb::addr_t vm_addr); 1063cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1073cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen lldb::break_id_t 1083cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen FindLocationIDByAddress (lldb::addr_t vm_addr); 1093cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1103cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen lldb::SBBreakpointLocation 1113cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen FindLocationByID (lldb::break_id_t bp_loc_id); 1123cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1133cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen lldb::SBBreakpointLocation 1143cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen GetLocationAtIndex (uint32_t index); 1153cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1163cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen void 1173cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen SetEnabled (bool enable); 1183cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1193cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen bool 1203cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen IsEnabled (); 1213fcc297c999218b19d7d5ad049e9c955c4bc481dJim Ingham 1222753a024a5a314232baa579c0ada87551aa86988Jim Ingham void 1232753a024a5a314232baa579c0ada87551aa86988Jim Ingham SetOneShot (bool one_shot); 1242753a024a5a314232baa579c0ada87551aa86988Jim Ingham 1252753a024a5a314232baa579c0ada87551aa86988Jim Ingham bool 1262753a024a5a314232baa579c0ada87551aa86988Jim Ingham IsOneShot (); 1272753a024a5a314232baa579c0ada87551aa86988Jim Ingham 1283fcc297c999218b19d7d5ad049e9c955c4bc481dJim Ingham bool 1293fcc297c999218b19d7d5ad049e9c955c4bc481dJim Ingham IsInternal (); 1303cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1313cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen uint32_t 1323cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen GetHitCount () const; 1333cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1343cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen void 1353cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen SetIgnoreCount (uint32_t count); 1363cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1373cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen uint32_t 1383cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen GetIgnoreCount () const; 1393cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 140a5dd2bbf6b8cb8634f29b50a181e64759aba7ebcJohnny Chen %feature("docstring", " 141a5dd2bbf6b8cb8634f29b50a181e64759aba7ebcJohnny Chen //-------------------------------------------------------------------------- 142a5dd2bbf6b8cb8634f29b50a181e64759aba7ebcJohnny Chen /// The breakpoint stops only if the condition expression evaluates to true. 143a5dd2bbf6b8cb8634f29b50a181e64759aba7ebcJohnny Chen //-------------------------------------------------------------------------- 144a5dd2bbf6b8cb8634f29b50a181e64759aba7ebcJohnny Chen ") SetCondition; 1453cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen void 1463cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen SetCondition (const char *condition); 1473cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 148a5dd2bbf6b8cb8634f29b50a181e64759aba7ebcJohnny Chen %feature("docstring", " 149a5dd2bbf6b8cb8634f29b50a181e64759aba7ebcJohnny Chen //------------------------------------------------------------------ 150a5dd2bbf6b8cb8634f29b50a181e64759aba7ebcJohnny Chen /// Get the condition expression for the breakpoint. 151a5dd2bbf6b8cb8634f29b50a181e64759aba7ebcJohnny Chen //------------------------------------------------------------------ 152a5dd2bbf6b8cb8634f29b50a181e64759aba7ebcJohnny Chen ") GetCondition; 1533cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen const char * 1543cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen GetCondition (); 1553cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1563cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen void 1573cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen SetThreadID (lldb::tid_t sb_thread_id); 1583cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1593cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen lldb::tid_t 1603cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen GetThreadID (); 1613cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1623cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen void 1633cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen SetThreadIndex (uint32_t index); 1643cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1653cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen uint32_t 1663cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen GetThreadIndex() const; 1673cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1683cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen void 1693cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen SetThreadName (const char *thread_name); 1703cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1713cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen const char * 1723cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen GetThreadName () const; 1733cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1743cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen void 1753cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen SetQueueName (const char *queue_name); 1763cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1773cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen const char * 1783cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen GetQueueName () const; 1793cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1803cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen void 1813cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen SetCallback (BreakpointHitCallback callback, void *baton); 1823cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1833cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen size_t 1843cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen GetNumResolvedLocations() const; 1853cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1863cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen size_t 1873cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen GetNumLocations() const; 1883cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1893cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen bool 1903cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen GetDescription (lldb::SBStream &description); 1913cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 1920765e3274aab0551fea7678bee565c7d68e0b786Enrico Granata bool 1930765e3274aab0551fea7678bee565c7d68e0b786Enrico Granata operator == (const lldb::SBBreakpoint& rhs); 1940765e3274aab0551fea7678bee565c7d68e0b786Enrico Granata 1950765e3274aab0551fea7678bee565c7d68e0b786Enrico Granata bool 1960765e3274aab0551fea7678bee565c7d68e0b786Enrico Granata operator != (const lldb::SBBreakpoint& rhs); 1970765e3274aab0551fea7678bee565c7d68e0b786Enrico Granata 19828e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham static bool 19928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham EventIsBreakpointEvent (const lldb::SBEvent &event); 20028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham 2013cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen static lldb::BreakpointEventType 2023cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen GetBreakpointEventTypeFromEvent (const lldb::SBEvent& event); 2033cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 2043cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen static lldb::SBBreakpoint 2053cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen GetBreakpointFromEvent (const lldb::SBEvent& event); 2063cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 2073cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen static lldb::SBBreakpointLocation 2083cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen GetBreakpointLocationAtIndexFromEvent (const lldb::SBEvent& event, uint32_t loc_idx); 20928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham 21028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham static uint32_t 21128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham GetNumBreakpointLocationsFromEvent (const lldb::SBEvent &event_sp); 212169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata 213169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata %pythoncode %{ 214169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata 215169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata __swig_getmethods__["id"] = GetID 216169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata if _newclass: id = property(GetID, None, doc='''A read only property that returns the ID of this breakpoint.''') 217169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata 218169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata __swig_getmethods__["enabled"] = IsEnabled 219169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata __swig_setmethods__["enabled"] = SetEnabled 220169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata if _newclass: enabled = property(IsEnabled, SetEnabled, doc='''A read/write property that configures whether this breakpoint is enabled or not.''') 221169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata 222169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata __swig_getmethods__["one_shot"] = IsOneShot 223169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata __swig_setmethods__["one_shot"] = SetOneShot 224169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata if _newclass: one_shot = property(IsOneShot, SetOneShot, doc='''A read/write property that configures whether this breakpoint is one-shot (deleted when hit) or not.''') 225169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata 226169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata __swig_getmethods__["num_locations"] = GetNumLocations 227169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata if _newclass: num_locations = property(GetNumLocations, None, doc='''A read only property that returns the count of locations of this breakpoint.''') 228169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata 229169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata %} 230169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata 231169c064fd54b83b5959ee5c9f2712cd2586261abEnrico Granata 2323cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen}; 2333cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen 2343cfd5e89ce6b66f271727032b36afb635287a24bJohnny Chen} // namespace lldb 235