diff options
| author | Jim Ingham <jingham@apple.com> | 2011-10-28 23:14:11 +0000 |
|---|---|---|
| committer | Jim Ingham <jingham@apple.com> | 2011-10-28 23:14:11 +0000 |
| commit | c6674fd597ad02f115a96405e1a1b0f65c7ba19c (patch) | |
| tree | 2ebfd981e4f35df1626141cdd84eda2b1219f2dd /lldb/source | |
| parent | dba74af1b84b80ac1253c9888dce8fcfded7df23 (diff) | |
| download | bcm5719-llvm-c6674fd597ad02f115a96405e1a1b0f65c7ba19c.tar.gz bcm5719-llvm-c6674fd597ad02f115a96405e1a1b0f65c7ba19c.zip | |
Added the ability for the target to specify Modules that will not be searched
when setting breakpoints, but only if no module is specified. The Darwin
platform uses this to not set breakpoints in dyld.
llvm-svn: 143249
Diffstat (limited to 'lldb/source')
| -rw-r--r-- | lldb/source/Core/SearchFilter.cpp | 23 | ||||
| -rw-r--r-- | lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp | 14 | ||||
| -rw-r--r-- | lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h | 3 | ||||
| -rw-r--r-- | lldb/source/Target/Platform.cpp | 1 | ||||
| -rw-r--r-- | lldb/source/Target/Target.cpp | 90 |
5 files changed, 118 insertions, 13 deletions
diff --git a/lldb/source/Core/SearchFilter.cpp b/lldb/source/Core/SearchFilter.cpp index 1fdbefe8e59..d31ed8b5818 100644 --- a/lldb/source/Core/SearchFilter.cpp +++ b/lldb/source/Core/SearchFilter.cpp @@ -287,6 +287,29 @@ SearchFilter::DoFunctionIteration (Function *function, const SymbolContext &cont } //---------------------------------------------------------------------- +// SearchFilterForNonModuleSpecificSearches: +// Selects a shared library matching a given file spec, consulting the targets "black list". +//---------------------------------------------------------------------- + + bool + SearchFilterForNonModuleSpecificSearches::ModulePasses (const FileSpec &module_spec) + { + if (m_target_sp->ModuleIsExcludedForNonModuleSpecificSearches (module_spec)) + return false; + else + return true; + } + + bool + SearchFilterForNonModuleSpecificSearches::ModulePasses (const lldb::ModuleSP &module_sp) + { + if (m_target_sp->ModuleIsExcludedForNonModuleSpecificSearches (module_sp)) + return false; + else + return true; + } + +//---------------------------------------------------------------------- // SearchFilterByModule: // Selects a shared library matching a given file spec //---------------------------------------------------------------------- diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp index 93be92353ef..24344306053 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp @@ -481,4 +481,16 @@ PlatformDarwin::GetGroupName (uint32_t gid) return NULL; } - +bool +PlatformDarwin::ModuleIsExcludedForNonModuleSpecificSearches (lldb_private::Target &target, const lldb::ModuleSP &module_sp) +{ + ObjectFile *obj_file = module_sp->GetObjectFile(); + if (!obj_file) + return false; + + ObjectFile::Type obj_type = obj_file->GetType(); + if (obj_type == ObjectFile::eTypeDynamicLinker) + return true; + else + return false; +} diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h index 38804edad18..9b3e771193e 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h @@ -85,6 +85,9 @@ public: lldb_private::Listener &listener, lldb_private::Error &error); + virtual bool + ModuleIsExcludedForNonModuleSpecificSearches (lldb_private::Target &target, const lldb::ModuleSP &module_sp); + protected: lldb::PlatformSP m_remote_platform_sp; // Allow multiple ways to connect to a remote darwin OS diff --git a/lldb/source/Target/Platform.cpp b/lldb/source/Target/Platform.cpp index 6a55c62194b..0213ac61485 100644 --- a/lldb/source/Target/Platform.cpp +++ b/lldb/source/Target/Platform.cpp @@ -591,4 +591,3 @@ Platform::DebugProcess (ProcessLaunchInfo &launch_info, } return process_sp; } - diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index dbfee315cbd..367bfc8d9c8 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -252,7 +252,7 @@ BreakpointSP Target::CreateBreakpoint (Address &addr, bool internal) { TargetSP target_sp = this->GetSP(); - SearchFilterSP filter_sp(new SearchFilter (target_sp)); + SearchFilterSP filter_sp(new SearchFilterForNonModuleSpecificSearches (target_sp)); BreakpointResolverSP resolver_sp (new BreakpointResolverAddress (NULL, addr)); return CreateBreakpoint (filter_sp, resolver_sp, internal); } @@ -295,7 +295,7 @@ Target::GetSearchFilterForModule (const FileSpec *containingModule) else { if (m_search_filter_sp.get() == NULL) - m_search_filter_sp.reset (new SearchFilter (target_sp)); + m_search_filter_sp.reset (new SearchFilterForNonModuleSpecificSearches (target_sp)); filter_sp = m_search_filter_sp; } return filter_sp; @@ -315,7 +315,7 @@ Target::GetSearchFilterForModuleList (const FileSpecList *containingModules) else { if (m_search_filter_sp.get() == NULL) - m_search_filter_sp.reset (new SearchFilter (target_sp)); + m_search_filter_sp.reset (new SearchFilterForNonModuleSpecificSearches (target_sp)); filter_sp = m_search_filter_sp; } return filter_sp; @@ -934,6 +934,50 @@ Target::ModulesDidUnload (ModuleList &module_list) BroadcastEvent (eBroadcastBitModulesUnloaded, NULL); } + +const bool +Target::ModuleIsExcludedForNonModuleSpecificSearches (const FileSpec &module_spec) +{ + + if (!m_breakpoints_use_platform_avoid) + return false; + else + { + ModuleList matchingModules; + const ArchSpec *arch_ptr = NULL; + const lldb_private::UUID *uuid_ptr= NULL; + const ConstString *object_name = NULL; + size_t num_modules = GetImages().FindModules(&module_spec, arch_ptr, uuid_ptr, object_name, matchingModules); + + // If there is more than one module for this file spec, only return true if ALL the modules are on the + // black list. + if (num_modules > 0) + { + for (int i = 0; i < num_modules; i++) + { + if (!ModuleIsExcludedForNonModuleSpecificSearches (matchingModules.GetModuleAtIndex(i))) + return false; + } + return true; + } + else + return false; + } +} + +const bool +Target::ModuleIsExcludedForNonModuleSpecificSearches (const lldb::ModuleSP &module_sp) +{ + if (!m_breakpoints_use_platform_avoid) + return false; + else if (GetPlatform()) + { + return GetPlatform()->ModuleIsExcludedForNonModuleSpecificSearches (*this, module_sp); + } + else + return false; +} + size_t Target::ReadMemoryFromFileCache (const Address& addr, void *dst, size_t dst_len, Error &error) { @@ -1935,6 +1979,7 @@ Target::SettingsController::CreateInstanceSettings (const char *instance_name) #define TSC_SOURCE_MAP "source-map" #define TSC_MAX_CHILDREN "max-children-count" #define TSC_MAX_STRLENSUMMARY "max-string-summary-length" +#define TSC_PLATFORM_AVOID "breakpoints-use-platform-avoid-list" static const ConstString & @@ -1986,6 +2031,14 @@ GetSettingNameForMaxStringSummaryLength () return g_const_string; } +static const ConstString & +GetSettingNameForPlatformAvoid () +{ + static ConstString g_const_string (TSC_PLATFORM_AVOID); + return g_const_string; +} + + bool Target::SettingsController::SetGlobalVariable (const ConstString &var_name, const char *index_value, @@ -2039,7 +2092,8 @@ TargetInstanceSettings::TargetInstanceSettings m_skip_prologue (true, true), m_source_map (NULL, NULL), m_max_children_display(256), - m_max_strlen_length(1024) + m_max_strlen_length(1024), + m_breakpoints_use_platform_avoid (true, true) { // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called // until the vtables for TargetInstanceSettings are properly set up, i.e. AFTER all the initializers. @@ -2067,7 +2121,8 @@ TargetInstanceSettings::TargetInstanceSettings (const TargetInstanceSettings &rh m_skip_prologue (rhs.m_skip_prologue), m_source_map (rhs.m_source_map), m_max_children_display(rhs.m_max_children_display), - m_max_strlen_length(rhs.m_max_strlen_length) + m_max_strlen_length(rhs.m_max_strlen_length), + m_breakpoints_use_platform_avoid (rhs.m_breakpoints_use_platform_avoid) { if (m_instance_name != InstanceSettings::GetDefaultName()) { @@ -2214,6 +2269,10 @@ TargetInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_n break; } } + else if (var_name == GetSettingNameForPlatformAvoid ()) + { + err = UserSettingsController::UpdateBooleanOptionValue (value, op, m_breakpoints_use_platform_avoid); + } } void @@ -2224,12 +2283,13 @@ TargetInstanceSettings::CopyInstanceSettings (const lldb::InstanceSettingsSP &ne if (!new_settings_ptr) return; - m_expr_prefix_file = new_settings_ptr->m_expr_prefix_file; - m_expr_prefix_contents_sp = new_settings_ptr->m_expr_prefix_contents_sp; - m_prefer_dynamic_value = new_settings_ptr->m_prefer_dynamic_value; - m_skip_prologue = new_settings_ptr->m_skip_prologue; - m_max_children_display = new_settings_ptr->m_max_children_display; - m_max_strlen_length = new_settings_ptr->m_max_strlen_length; + m_expr_prefix_file = new_settings_ptr->m_expr_prefix_file; + m_expr_prefix_contents_sp = new_settings_ptr->m_expr_prefix_contents_sp; + m_prefer_dynamic_value = new_settings_ptr->m_prefer_dynamic_value; + m_skip_prologue = new_settings_ptr->m_skip_prologue; + m_max_children_display = new_settings_ptr->m_max_children_display; + m_max_strlen_length = new_settings_ptr->m_max_strlen_length; + m_breakpoints_use_platform_avoid = new_settings_ptr->m_breakpoints_use_platform_avoid; } bool @@ -2271,6 +2331,13 @@ TargetInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry, count_str.Printf ("%d", m_max_strlen_length); value.AppendString (count_str.GetData()); } + else if (var_name == GetSettingNameForPlatformAvoid()) + { + if (m_breakpoints_use_platform_avoid) + value.AppendString ("true"); + else + value.AppendString ("false"); + } else { if (err) @@ -2326,5 +2393,6 @@ Target::SettingsController::instance_settings_table[] = { TSC_SOURCE_MAP , eSetVarTypeArray , NULL , NULL, false, false, "Source path remappings to use when locating source files from debug information." }, { TSC_MAX_CHILDREN , eSetVarTypeInt , "256" , NULL, true, false, "Maximum number of children to expand in any level of depth." }, { TSC_MAX_STRLENSUMMARY , eSetVarTypeInt , "1024" , NULL, true, false, "Maximum number of characters to show when using %s in summary strings." }, + { TSC_PLATFORM_AVOID , eSetVarTypeBoolean, "true" , NULL, false, false, "Consult the platform module avoid list when setting non-module specific breakpoints." }, { NULL , eSetVarTypeNone , NULL , NULL, false, false, NULL } }; |

