Skip to content

Commit

Permalink
Add a "step-avoid-libraries" setting to complement the "step-avoid-re…
Browse files Browse the repository at this point in the history
…gexp" setting.

llvm-svn: 199943
  • Loading branch information
jimingham committed Jan 23, 2014
1 parent 9d11702 commit 4da6206
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 5 deletions.
3 changes: 3 additions & 0 deletions lldb/include/lldb/Target/Thread.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ class ThreadProperties : public Properties
const RegularExpression *
GetSymbolsToAvoidRegexp();

FileSpecList &
GetLibrariesToAvoid() const;

bool
GetTraceEnabledState() const;
};
Expand Down
2 changes: 1 addition & 1 deletion lldb/include/lldb/Target/ThreadPlanStepInRange.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ class ThreadPlanStepInRange :
SetFlagsToDefault ();

bool
FrameMatchesAvoidRegexp ();
FrameMatchesAvoidCriteria ();

private:

Expand Down
12 changes: 12 additions & 0 deletions lldb/source/Target/Thread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "lldb/Core/StreamString.h"
#include "lldb/Core/RegularExpression.h"
#include "lldb/Host/Host.h"
#include "lldb/Interpreter/OptionValueFileSpecList.h"
#include "lldb/Symbol/Function.h"
#include "lldb/Target/DynamicLoader.h"
#include "lldb/Target/ExecutionContext.h"
Expand Down Expand Up @@ -61,12 +62,14 @@ static PropertyDefinition
g_properties[] =
{
{ "step-avoid-regexp", OptionValue::eTypeRegex , true , REG_EXTENDED, "^std::", NULL, "A regular expression defining functions step-in won't stop in." },
{ "step-avoid-libraries", OptionValue::eTypeFileSpecList , true , REG_EXTENDED, NULL, NULL, "A list of libraries that source stepping won't stop in." },
{ "trace-thread", OptionValue::eTypeBoolean, false, false, NULL, NULL, "If true, this thread will single-step and log execution." },
{ NULL , OptionValue::eTypeInvalid, false, 0 , NULL, NULL, NULL }
};

enum {
ePropertyStepAvoidRegex,
ePropertyStepAvoidLibraries,
ePropertyEnableThreadTrace
};

Expand Down Expand Up @@ -132,6 +135,15 @@ ThreadProperties::GetSymbolsToAvoidRegexp()
return m_collection_sp->GetPropertyAtIndexAsOptionValueRegex (NULL, idx);
}

FileSpecList &
ThreadProperties::GetLibrariesToAvoid() const
{
const uint32_t idx = ePropertyStepAvoidLibraries;
OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
assert(option_value);
return option_value->GetCurrentValue();
}

bool
ThreadProperties::GetTraceEnabledState() const
{
Expand Down
31 changes: 27 additions & 4 deletions lldb/source/Target/ThreadPlanStepInRange.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

#include "lldb/lldb-private-log.h"
#include "lldb/Core/Log.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/Stream.h"
#include "lldb/Symbol/Symbol.h"
#include "lldb/Symbol/Function.h"
Expand Down Expand Up @@ -273,10 +274,32 @@ ThreadPlanStepInRange::SetDefaultFlagValue (uint32_t new_value)
}

bool
ThreadPlanStepInRange::FrameMatchesAvoidRegexp ()
ThreadPlanStepInRange::FrameMatchesAvoidCriteria ()
{
StackFrame *frame = GetThread().GetStackFrameAtIndex(0).get();


// Check the library list first, as that's cheapest:
FileSpecList libraries_to_avoid (GetThread().GetLibrariesToAvoid());
size_t num_libraries = libraries_to_avoid.GetSize();
bool libraries_say_avoid = false;
SymbolContext sc(frame->GetSymbolContext(eSymbolContextModule));
FileSpec frame_library(sc.module_sp->GetFileSpec());

if (frame_library)
{
for (size_t i = 0; i < num_libraries; i++)
{
const FileSpec &file_spec(libraries_to_avoid.GetFileSpecAtIndex(i));
if (FileSpec::Equal (file_spec, frame_library, false))
{
libraries_say_avoid = true;
break;
}
}
}
if (libraries_say_avoid)
return true;

const RegularExpression *avoid_regexp_to_use = m_avoid_regexp_ap.get();
if (avoid_regexp_to_use == NULL)
avoid_regexp_to_use = GetThread().GetSymbolsToAvoidRegexp();
Expand Down Expand Up @@ -368,8 +391,8 @@ ThreadPlanStepInRange::DefaultShouldStopHereCallback (ThreadPlan *current_plan,
if (!should_step_out)
{
ThreadPlanStepInRange *step_in_range_plan = static_cast<ThreadPlanStepInRange *> (current_plan);
// Don't log the should_step_out here, it's easier to do it in FrameMatchesAvoidRegexp.
should_step_out = step_in_range_plan->FrameMatchesAvoidRegexp ();
// Don't log the should_step_out here, it's easier to do it in FrameMatchesAvoidCriteria.
should_step_out = step_in_range_plan->FrameMatchesAvoidCriteria ();
}
}

Expand Down

0 comments on commit 4da6206

Please sign in to comment.