summaryrefslogtreecommitdiff
path: root/lldb/source/Breakpoint/BreakpointLocation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Breakpoint/BreakpointLocation.cpp')
-rw-r--r--lldb/source/Breakpoint/BreakpointLocation.cpp527
1 files changed, 0 insertions, 527 deletions
diff --git a/lldb/source/Breakpoint/BreakpointLocation.cpp b/lldb/source/Breakpoint/BreakpointLocation.cpp
deleted file mode 100644
index c99eb4663782..000000000000
--- a/lldb/source/Breakpoint/BreakpointLocation.cpp
+++ /dev/null
@@ -1,527 +0,0 @@
-//===-- BreakpointLocation.cpp ----------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-// C Includes
-// C++ Includes
-#include <string>
-
-// Other libraries and framework includes
-// Project includes
-#include "lldb/Breakpoint/BreakpointLocation.h"
-#include "lldb/Breakpoint/BreakpointID.h"
-#include "lldb/Breakpoint/StoppointCallbackContext.h"
-#include "lldb/Core/Debugger.h"
-#include "lldb/Core/Log.h"
-#include "lldb/Target/Target.h"
-#include "lldb/Target/ThreadPlan.h"
-#include "lldb/Target/Process.h"
-#include "lldb/Core/StreamString.h"
-#include "lldb/lldb-private-log.h"
-#include "lldb/Target/Thread.h"
-#include "lldb/Target/ThreadSpec.h"
-
-using namespace lldb;
-using namespace lldb_private;
-
-BreakpointLocation::BreakpointLocation
-(
- break_id_t loc_id,
- Breakpoint &owner,
- const Address &addr,
- lldb::tid_t tid,
- bool hardware
-) :
- StoppointLocation (loc_id, addr.GetOpcodeLoadAddress(&owner.GetTarget()), hardware),
- m_being_created(true),
- m_address (addr),
- m_owner (owner),
- m_options_ap (),
- m_bp_site_sp ()
-{
- SetThreadID (tid);
- m_being_created = false;
-}
-
-BreakpointLocation::~BreakpointLocation()
-{
- ClearBreakpointSite();
-}
-
-lldb::addr_t
-BreakpointLocation::GetLoadAddress () const
-{
- return m_address.GetOpcodeLoadAddress (&m_owner.GetTarget());
-}
-
-Address &
-BreakpointLocation::GetAddress ()
-{
- return m_address;
-}
-
-Breakpoint &
-BreakpointLocation::GetBreakpoint ()
-{
- return m_owner;
-}
-
-bool
-BreakpointLocation::IsEnabled () const
-{
- if (!m_owner.IsEnabled())
- return false;
- else if (m_options_ap.get() != NULL)
- return m_options_ap->IsEnabled();
- else
- return true;
-}
-
-void
-BreakpointLocation::SetEnabled (bool enabled)
-{
- GetLocationOptions()->SetEnabled(enabled);
- if (enabled)
- {
- ResolveBreakpointSite();
- }
- else
- {
- ClearBreakpointSite();
- }
- SendBreakpointLocationChangedEvent (enabled ? eBreakpointEventTypeEnabled : eBreakpointEventTypeDisabled);
-}
-
-void
-BreakpointLocation::SetThreadID (lldb::tid_t thread_id)
-{
- if (thread_id != LLDB_INVALID_THREAD_ID)
- GetLocationOptions()->SetThreadID(thread_id);
- else
- {
- // If we're resetting this to an invalid thread id, then
- // don't make an options pointer just to do that.
- if (m_options_ap.get() != NULL)
- m_options_ap->SetThreadID (thread_id);
- }
- SendBreakpointLocationChangedEvent (eBreakpointEventTypeThreadChanged);
-}
-
-lldb::tid_t
-BreakpointLocation::GetThreadID ()
-{
- if (GetOptionsNoCreate()->GetThreadSpecNoCreate())
- return GetOptionsNoCreate()->GetThreadSpecNoCreate()->GetTID();
- else
- return LLDB_INVALID_THREAD_ID;
-}
-
-void
-BreakpointLocation::SetThreadIndex (uint32_t index)
-{
- if (index != 0)
- GetLocationOptions()->GetThreadSpec()->SetIndex(index);
- else
- {
- // If we're resetting this to an invalid thread id, then
- // don't make an options pointer just to do that.
- if (m_options_ap.get() != NULL)
- m_options_ap->GetThreadSpec()->SetIndex(index);
- }
- SendBreakpointLocationChangedEvent (eBreakpointEventTypeThreadChanged);
-
-}
-
-uint32_t
-BreakpointLocation::GetThreadIndex() const
-{
- if (GetOptionsNoCreate()->GetThreadSpecNoCreate())
- return GetOptionsNoCreate()->GetThreadSpecNoCreate()->GetIndex();
- else
- return 0;
-}
-
-void
-BreakpointLocation::SetThreadName (const char *thread_name)
-{
- if (thread_name != NULL)
- GetLocationOptions()->GetThreadSpec()->SetName(thread_name);
- else
- {
- // If we're resetting this to an invalid thread id, then
- // don't make an options pointer just to do that.
- if (m_options_ap.get() != NULL)
- m_options_ap->GetThreadSpec()->SetName(thread_name);
- }
- SendBreakpointLocationChangedEvent (eBreakpointEventTypeThreadChanged);
-}
-
-const char *
-BreakpointLocation::GetThreadName () const
-{
- if (GetOptionsNoCreate()->GetThreadSpecNoCreate())
- return GetOptionsNoCreate()->GetThreadSpecNoCreate()->GetName();
- else
- return NULL;
-}
-
-void
-BreakpointLocation::SetQueueName (const char *queue_name)
-{
- if (queue_name != NULL)
- GetLocationOptions()->GetThreadSpec()->SetQueueName(queue_name);
- else
- {
- // If we're resetting this to an invalid thread id, then
- // don't make an options pointer just to do that.
- if (m_options_ap.get() != NULL)
- m_options_ap->GetThreadSpec()->SetQueueName(queue_name);
- }
- SendBreakpointLocationChangedEvent (eBreakpointEventTypeThreadChanged);
-}
-
-const char *
-BreakpointLocation::GetQueueName () const
-{
- if (GetOptionsNoCreate()->GetThreadSpecNoCreate())
- return GetOptionsNoCreate()->GetThreadSpecNoCreate()->GetQueueName();
- else
- return NULL;
-}
-
-bool
-BreakpointLocation::InvokeCallback (StoppointCallbackContext *context)
-{
- if (m_options_ap.get() != NULL && m_options_ap->HasCallback())
- return m_options_ap->InvokeCallback (context, m_owner.GetID(), GetID());
- else
- return m_owner.InvokeCallback (context, GetID());
-}
-
-void
-BreakpointLocation::SetCallback (BreakpointHitCallback callback, void *baton,
- bool is_synchronous)
-{
- // The default "Baton" class will keep a copy of "baton" and won't free
- // or delete it when it goes goes out of scope.
- GetLocationOptions()->SetCallback(callback, BatonSP (new Baton(baton)), is_synchronous);
- SendBreakpointLocationChangedEvent (eBreakpointEventTypeCommandChanged);
-}
-
-void
-BreakpointLocation::SetCallback (BreakpointHitCallback callback, const BatonSP &baton_sp,
- bool is_synchronous)
-{
- GetLocationOptions()->SetCallback (callback, baton_sp, is_synchronous);
- SendBreakpointLocationChangedEvent (eBreakpointEventTypeCommandChanged);
-}
-
-
-void
-BreakpointLocation::ClearCallback ()
-{
- GetLocationOptions()->ClearCallback();
-}
-
-void
-BreakpointLocation::SetCondition (const char *condition)
-{
- GetLocationOptions()->SetCondition (condition);
- SendBreakpointLocationChangedEvent (eBreakpointEventTypeConditionChanged);
-}
-
-ThreadPlan *
-BreakpointLocation::GetThreadPlanToTestCondition (ExecutionContext &exe_ctx, Stream &error)
-{
- if (m_options_ap.get())
- return m_options_ap->GetThreadPlanToTestCondition (exe_ctx, shared_from_this(), error);
- else
- return m_owner.GetThreadPlanToTestCondition (exe_ctx, shared_from_this(), error);
-}
-
-const char *
-BreakpointLocation::GetConditionText () const
-{
- return GetOptionsNoCreate()->GetConditionText();
-}
-
-uint32_t
-BreakpointLocation::GetIgnoreCount ()
-{
- return GetOptionsNoCreate()->GetIgnoreCount();
-}
-
-void
-BreakpointLocation::SetIgnoreCount (uint32_t n)
-{
- GetLocationOptions()->SetIgnoreCount(n);
- SendBreakpointLocationChangedEvent (eBreakpointEventTypeIgnoreChanged);
-}
-
-const BreakpointOptions *
-BreakpointLocation::GetOptionsNoCreate () const
-{
- if (m_options_ap.get() != NULL)
- return m_options_ap.get();
- else
- return m_owner.GetOptions ();
-}
-
-BreakpointOptions *
-BreakpointLocation::GetLocationOptions ()
-{
- // If we make the copy we don't copy the callbacks because that is potentially
- // expensive and we don't want to do that for the simple case where someone is
- // just disabling the location.
- if (m_options_ap.get() == NULL)
- m_options_ap.reset(BreakpointOptions::CopyOptionsNoCallback(*m_owner.GetOptions ()));
-
- return m_options_ap.get();
-}
-
-bool
-BreakpointLocation::ValidForThisThread (Thread *thread)
-{
- return thread->MatchesSpec(GetOptionsNoCreate()->GetThreadSpecNoCreate());
-}
-
-// RETURNS - true if we should stop at this breakpoint, false if we
-// should continue. Note, we don't check the thread spec for the breakpoint
-// here, since if the breakpoint is not for this thread, then the event won't
-// even get reported, so the check is redundant.
-
-bool
-BreakpointLocation::ShouldStop (StoppointCallbackContext *context)
-{
- bool should_stop = true;
- LogSP log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS);
-
- IncrementHitCount();
-
- if (!IsEnabled())
- return false;
-
- if (GetHitCount() <= GetIgnoreCount())
- return false;
-
- // We only run synchronous callbacks in ShouldStop:
- context->is_synchronous = true;
- should_stop = InvokeCallback (context);
-
- if (log)
- {
- StreamString s;
- GetDescription (&s, lldb::eDescriptionLevelVerbose);
- log->Printf ("Hit breakpoint location: %s, %s.\n", s.GetData(), should_stop ? "stopping" : "continuing");
- }
-
- return should_stop;
-}
-
-bool
-BreakpointLocation::IsResolved () const
-{
- return m_bp_site_sp.get() != NULL;
-}
-
-lldb::BreakpointSiteSP
-BreakpointLocation::GetBreakpointSite() const
-{
- return m_bp_site_sp;
-}
-
-bool
-BreakpointLocation::ResolveBreakpointSite ()
-{
- if (m_bp_site_sp)
- return true;
-
- Process *process = m_owner.GetTarget().GetProcessSP().get();
- if (process == NULL)
- return false;
-
- if (m_owner.GetTarget().GetSectionLoadList().IsEmpty())
- return false;
-
- lldb::break_id_t new_id = process->CreateBreakpointSite (shared_from_this(), false);
-
- if (new_id == LLDB_INVALID_BREAK_ID)
- {
- LogSP log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS);
- if (log)
- log->Warning ("Tried to add breakpoint site at 0x%llx but it was already present.\n",
- m_address.GetOpcodeLoadAddress (&m_owner.GetTarget()));
- return false;
- }
-
- return true;
-}
-
-bool
-BreakpointLocation::SetBreakpointSite (BreakpointSiteSP& bp_site_sp)
-{
- m_bp_site_sp = bp_site_sp;
- return true;
-}
-
-bool
-BreakpointLocation::ClearBreakpointSite ()
-{
- if (m_bp_site_sp.get())
- {
- m_owner.GetTarget().GetProcessSP()->RemoveOwnerFromBreakpointSite (GetBreakpoint().GetID(),
- GetID(), m_bp_site_sp);
- m_bp_site_sp.reset();
- return true;
- }
- return false;
-}
-
-void
-BreakpointLocation::GetDescription (Stream *s, lldb::DescriptionLevel level)
-{
- SymbolContext sc;
- s->Indent();
- BreakpointID::GetCanonicalReference(s, m_owner.GetID(), GetID());
-
- if (level == lldb::eDescriptionLevelBrief)
- return;
-
- s->PutCString(": ");
-
- if (level == lldb::eDescriptionLevelVerbose)
- s->IndentMore();
-
- if (m_address.IsSectionOffset())
- {
- m_address.CalculateSymbolContext(&sc);
-
- if (level == lldb::eDescriptionLevelFull)
- {
- s->PutCString("where = ");
- sc.DumpStopContext (s, m_owner.GetTarget().GetProcessSP().get(), m_address, false, true, false);
- }
- else
- {
- if (sc.module_sp)
- {
- s->EOL();
- s->Indent("module = ");
- sc.module_sp->GetFileSpec().Dump (s);
- }
-
- if (sc.comp_unit != NULL)
- {
- s->EOL();
- s->Indent("compile unit = ");
- static_cast<FileSpec*>(sc.comp_unit)->GetFilename().Dump (s);
-
- if (sc.function != NULL)
- {
- s->EOL();
- s->Indent("function = ");
- s->PutCString (sc.function->GetMangled().GetName().AsCString("<unknown>"));
- }
-
- if (sc.line_entry.line > 0)
- {
- s->EOL();
- s->Indent("location = ");
- sc.line_entry.DumpStopContext (s, true);
- }
-
- }
- else
- {
- // If we don't have a comp unit, see if we have a symbol we can print.
- if (sc.symbol)
- {
- s->EOL();
- s->Indent("symbol = ");
- s->PutCString(sc.symbol->GetMangled().GetName().AsCString("<unknown>"));
- }
- }
- }
- }
-
- if (level == lldb::eDescriptionLevelVerbose)
- {
- s->EOL();
- s->Indent();
- }
- s->Printf ("%saddress = ", (level == lldb::eDescriptionLevelFull && m_address.IsSectionOffset()) ? ", " : "");
- ExecutionContextScope *exe_scope = NULL;
- Target *target = &m_owner.GetTarget();
- if (target)
- exe_scope = target->GetProcessSP().get();
- if (exe_scope == NULL)
- exe_scope = target;
-
- m_address.Dump(s, exe_scope, Address::DumpStyleLoadAddress, Address::DumpStyleModuleWithFileAddress);
-
- if (level == lldb::eDescriptionLevelVerbose)
- {
- s->EOL();
- s->Indent();
- s->Printf("resolved = %s\n", IsResolved() ? "true" : "false");
-
- s->Indent();
- s->Printf ("hit count = %-4u\n", GetHitCount());
-
- if (m_options_ap.get())
- {
- s->Indent();
- m_options_ap->GetDescription (s, level);
- s->EOL();
- }
- s->IndentLess();
- }
- else
- {
- s->Printf(", %sresolved, hit count = %u ",
- (IsResolved() ? "" : "un"),
- GetHitCount());
- if (m_options_ap.get())
- {
- m_options_ap->GetDescription (s, level);
- }
- }
-}
-
-void
-BreakpointLocation::Dump(Stream *s) const
-{
- if (s == NULL)
- return;
-
- s->Printf("BreakpointLocation %u: tid = %4.4llx load addr = 0x%8.8llx state = %s type = %s breakpoint "
- "hw_index = %i hit_count = %-4u ignore_count = %-4u",
- GetID(),
- GetOptionsNoCreate()->GetThreadSpecNoCreate()->GetTID(),
- (uint64_t) m_address.GetOpcodeLoadAddress (&m_owner.GetTarget()),
- (m_options_ap.get() ? m_options_ap->IsEnabled() : m_owner.IsEnabled()) ? "enabled " : "disabled",
- IsHardware() ? "hardware" : "software",
- GetHardwareIndex(),
- GetHitCount(),
- GetOptionsNoCreate()->GetIgnoreCount());
-}
-
-void
-BreakpointLocation::SendBreakpointLocationChangedEvent (lldb::BreakpointEventType eventKind)
-{
- if (!m_being_created
- && !m_owner.IsInternal()
- && m_owner.GetTarget().EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged))
- {
- Breakpoint::BreakpointEventData *data = new Breakpoint::BreakpointEventData (eventKind,
- m_owner.shared_from_this());
- data->GetBreakpointLocationCollection().Add (shared_from_this());
- m_owner.GetTarget().BroadcastEvent (Target::eBroadcastBitBreakpointChanged, data);
- }
-}
-