diff --git a/lldb/source/Host/common/NativeBreakpoint.cpp b/lldb/source/Host/common/NativeBreakpoint.cpp
index 622b4ea..d61a2f5 100644
--- a/lldb/source/Host/common/NativeBreakpoint.cpp
+++ b/lldb/source/Host/common/NativeBreakpoint.cpp
@@ -9,108 +9,101 @@
 
 #include "lldb/Host/common/NativeBreakpoint.h"
 
-#include "lldb/lldb-defines.h"
 #include "lldb/Core/Error.h"
 #include "lldb/Core/Log.h"
+#include "lldb/lldb-defines.h"
 
 using namespace lldb_private;
 
-NativeBreakpoint::NativeBreakpoint (lldb::addr_t addr) :
-    m_addr (addr),
-    m_ref_count (1),
-    m_enabled (true)
-{
-    assert (addr != LLDB_INVALID_ADDRESS && "breakpoint set for invalid address");
+NativeBreakpoint::NativeBreakpoint(lldb::addr_t addr)
+    : m_addr(addr), m_ref_count(1), m_enabled(true) {
+  assert(addr != LLDB_INVALID_ADDRESS && "breakpoint set for invalid address");
 }
 
-NativeBreakpoint::~NativeBreakpoint ()
-{
+NativeBreakpoint::~NativeBreakpoint() {}
+
+void NativeBreakpoint::AddRef() {
+  ++m_ref_count;
+
+  Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
+  if (log)
+    log->Printf("NativeBreakpoint::%s addr = 0x%" PRIx64
+                " bumped up, new ref count %" PRIu32,
+                __FUNCTION__, m_addr, m_ref_count);
 }
 
-void
-NativeBreakpoint::AddRef ()
-{
-    ++m_ref_count;
+int32_t NativeBreakpoint::DecRef() {
+  --m_ref_count;
 
-    Log *log (GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
+  Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
+  if (log)
+    log->Printf("NativeBreakpoint::%s addr = 0x%" PRIx64
+                " ref count decremented, new ref count %" PRIu32,
+                __FUNCTION__, m_addr, m_ref_count);
+
+  return m_ref_count;
+}
+
+Error NativeBreakpoint::Enable() {
+  Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
+
+  if (m_enabled) {
+    // We're already enabled. Just log and exit.
     if (log)
-        log->Printf ("NativeBreakpoint::%s addr = 0x%" PRIx64 " bumped up, new ref count %" PRIu32, __FUNCTION__, m_addr, m_ref_count);  
+      log->Printf("NativeBreakpoint::%s addr = 0x%" PRIx64
+                  " already enabled, ignoring.",
+                  __FUNCTION__, m_addr);
+    return Error();
+  }
+
+  // Log and enable.
+  if (log)
+    log->Printf("NativeBreakpoint::%s addr = 0x%" PRIx64 " enabling...",
+                __FUNCTION__, m_addr);
+
+  Error error = DoEnable();
+  if (error.Success()) {
+    m_enabled = true;
+    if (log)
+      log->Printf("NativeBreakpoint::%s addr = 0x%" PRIx64 " enable SUCCESS.",
+                  __FUNCTION__, m_addr);
+  } else {
+    if (log)
+      log->Printf("NativeBreakpoint::%s addr = 0x%" PRIx64 " enable FAIL: %s",
+                  __FUNCTION__, m_addr, error.AsCString());
+  }
+
+  return error;
 }
 
-int32_t
-NativeBreakpoint::DecRef ()
-{
-    --m_ref_count;
+Error NativeBreakpoint::Disable() {
+  Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
 
-    Log *log (GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
+  if (!m_enabled) {
+    // We're already disabled. Just log and exit.
     if (log)
-        log->Printf ("NativeBreakpoint::%s addr = 0x%" PRIx64 " ref count decremented, new ref count %" PRIu32, __FUNCTION__, m_addr, m_ref_count);  
+      log->Printf("NativeBreakpoint::%s addr = 0x%" PRIx64
+                  " already disabled, ignoring.",
+                  __FUNCTION__, m_addr);
+    return Error();
+  }
 
-    return m_ref_count;
-}
+  // Log and disable.
+  if (log)
+    log->Printf("NativeBreakpoint::%s addr = 0x%" PRIx64 " disabling...",
+                __FUNCTION__, m_addr);
 
-Error
-NativeBreakpoint::Enable ()
-{
-    Log *log (GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
-
-    if (m_enabled)
-    {
-        // We're already enabled. Just log and exit.
-        if (log)
-            log->Printf ("NativeBreakpoint::%s addr = 0x%" PRIx64 " already enabled, ignoring.", __FUNCTION__, m_addr);
-        return Error ();
-    }
-
-    // Log and enable.
+  Error error = DoDisable();
+  if (error.Success()) {
+    m_enabled = false;
     if (log)
-        log->Printf ("NativeBreakpoint::%s addr = 0x%" PRIx64 " enabling...", __FUNCTION__, m_addr);
-
-    Error error = DoEnable ();
-    if (error.Success ())
-    {
-        m_enabled = true;
-        if (log)
-            log->Printf ("NativeBreakpoint::%s addr = 0x%" PRIx64 " enable SUCCESS.", __FUNCTION__, m_addr);  
-    }
-    else
-    {
-        if (log)
-            log->Printf ("NativeBreakpoint::%s addr = 0x%" PRIx64 " enable FAIL: %s", __FUNCTION__, m_addr, error.AsCString ());
-    }
-
-    return error;
-}
-
-Error
-NativeBreakpoint::Disable ()
-{
-    Log *log (GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
-
-    if (!m_enabled)
-    {
-        // We're already disabled. Just log and exit.
-        if (log)
-            log->Printf ("NativeBreakpoint::%s addr = 0x%" PRIx64 " already disabled, ignoring.", __FUNCTION__, m_addr);
-        return Error ();
-    }
-
-    // Log and disable.
+      log->Printf("NativeBreakpoint::%s addr = 0x%" PRIx64 " disable SUCCESS.",
+                  __FUNCTION__, m_addr);
+  } else {
     if (log)
-        log->Printf ("NativeBreakpoint::%s addr = 0x%" PRIx64 " disabling...", __FUNCTION__, m_addr);
+      log->Printf("NativeBreakpoint::%s addr = 0x%" PRIx64 " disable FAIL: %s",
+                  __FUNCTION__, m_addr, error.AsCString());
+  }
 
-    Error error = DoDisable ();
-    if (error.Success ())
-    {
-        m_enabled = false;
-        if (log)
-            log->Printf ("NativeBreakpoint::%s addr = 0x%" PRIx64 " disable SUCCESS.", __FUNCTION__, m_addr);  
-    }
-    else
-    {
-        if (log)
-            log->Printf ("NativeBreakpoint::%s addr = 0x%" PRIx64 " disable FAIL: %s", __FUNCTION__, m_addr, error.AsCString ());
-    }
-
-    return error;
+  return error;
 }
