diff --git a/lldb/include/lldb/Core/Debugger.h b/lldb/include/lldb/Core/Debugger.h index 914e2001cd8c..ea2249880395 100644 --- a/lldb/include/lldb/Core/Debugger.h +++ b/lldb/include/lldb/Core/Debugger.h @@ -345,7 +345,11 @@ public: SourceManager & GetSourceManager () { - return m_source_manager; + lldb::TargetSP selected_target = GetSelectedTarget(); + if (selected_target) + return selected_target->GetSourceManager(); + else + return m_source_manager; } lldb::TargetSP @@ -458,7 +462,7 @@ protected: TargetList m_target_list; PlatformList m_platform_list; Listener m_listener; - SourceManager m_source_manager; + SourceManager m_source_manager; // This is a scratch source manager that we return if we have no targets. std::auto_ptr m_command_interpreter_ap; InputReaderStack m_input_reader_stack; diff --git a/lldb/include/lldb/Core/SourceManager.h b/lldb/include/lldb/Core/SourceManager.h index fa63d9cc7d12..94c08953fcec 100644 --- a/lldb/include/lldb/Core/SourceManager.h +++ b/lldb/include/lldb/Core/SourceManager.h @@ -71,7 +71,9 @@ public: //------------------------------------------------------------------ // Constructors and Destructors //------------------------------------------------------------------ - SourceManager(); + // A source manager can be made with a non-null target, in which case it can use the path remappings to find + // source files that are not in their build locations. With no target it won't be able to do this. + SourceManager(Target *target); ~SourceManager(); @@ -84,16 +86,14 @@ public: } size_t - DisplaySourceLines (Target *target, - const FileSpec &file, + DisplaySourceLines (const FileSpec &file, uint32_t line, uint32_t context_before, uint32_t context_after, Stream *s); size_t - DisplaySourceLinesWithLineNumbers (Target *target, - const FileSpec &file, + DisplaySourceLinesWithLineNumbers (const FileSpec &file, uint32_t line, uint32_t context_before, uint32_t context_after, @@ -114,12 +114,23 @@ public: DisplayMoreWithLineNumbers (Stream *s, const SymbolContextList *bp_locs = NULL); + bool + SetDefaultFileAndLine (const FileSpec &file_spec, uint32_t line); + + bool + GetDefaultFileAndLine (FileSpec &file_spec, uint32_t &line); + + bool + DefaultFileAndLineSet () + { + return (m_last_file_sp.get() != NULL); + } + protected: FileSP - GetFile (const FileSpec &file_spec, Target *target); + GetFile (const FileSpec &file_spec); - //------------------------------------------------------------------ // Classes that inherit from SourceManager can see and modify these //------------------------------------------------------------------ @@ -129,6 +140,7 @@ protected: uint32_t m_last_file_line; uint32_t m_last_file_context_before; uint32_t m_last_file_context_after; + Target *m_target; private: //------------------------------------------------------------------ // For SourceManager only diff --git a/lldb/include/lldb/Target/ObjCLanguageRuntime.h b/lldb/include/lldb/Target/ObjCLanguageRuntime.h index e8ab47a22315..d1b12cccb220 100644 --- a/lldb/include/lldb/Target/ObjCLanguageRuntime.h +++ b/lldb/include/lldb/Target/ObjCLanguageRuntime.h @@ -99,6 +99,12 @@ public: static bool ParseMethodName (const char *name, ConstString *class_name, ConstString *method_name, ConstString *base_name); + static bool + IsPossibleObjCMethodName (const char *name) + { + return (name && (name[0] == '+' || name[0] == '-') && name[1] == '['); + } + protected: //------------------------------------------------------------------ // Classes that inherit from ObjCLanguageRuntime can see and modify these diff --git a/lldb/include/lldb/Target/StackFrameList.h b/lldb/include/lldb/Target/StackFrameList.h index 90c98d911898..d37f9257f95f 100644 --- a/lldb/include/lldb/Target/StackFrameList.h +++ b/lldb/include/lldb/Target/StackFrameList.h @@ -48,7 +48,7 @@ public: // Mark a stack frame as the current frame uint32_t SetSelectedFrame (lldb_private::StackFrame *frame); - + uint32_t GetSelectedFrameIndex () const; @@ -56,6 +56,9 @@ public: void SetSelectedFrameByIndex (uint32_t idx); + void + SetDefaultFileAndLineToSelectedFrame(); + void Clear (); diff --git a/lldb/include/lldb/Target/Target.h b/lldb/include/lldb/Target/Target.h index 43f27bdd7bf7..b63234f4c311 100644 --- a/lldb/include/lldb/Target/Target.h +++ b/lldb/include/lldb/Target/Target.h @@ -23,6 +23,7 @@ #include "lldb/Core/Event.h" #include "lldb/Core/ModuleList.h" #include "lldb/Core/UserSettingsController.h" +#include "lldb/Core/SourceManager.h" #include "lldb/Expression/ClangPersistentVariables.h" #include "lldb/Interpreter/NamedOptionValue.h" #include "lldb/Symbol/SymbolContext.h" @@ -758,6 +759,12 @@ public: { return m_platform_sp; } + + SourceManager & + GetSourceManager () + { + return m_source_manager; + } //------------------------------------------------------------------ // Target::SettingsController @@ -830,6 +837,7 @@ protected: std::auto_ptr m_scratch_ast_context_ap; ClangPersistentVariables m_persistent_variables; ///< These are the persistent variables associated with this process for the expression parser. + SourceManager m_source_manager; typedef std::map StopHookCollection; StopHookCollection m_stop_hooks; diff --git a/lldb/include/lldb/Target/Thread.h b/lldb/include/lldb/Target/Thread.h index 3e101032ed44..afb70b0e1927 100644 --- a/lldb/include/lldb/Target/Thread.h +++ b/lldb/include/lldb/Target/Thread.h @@ -326,28 +326,55 @@ public: } virtual uint32_t - GetStackFrameCount(); + GetStackFrameCount() + { + return GetStackFrameList().GetNumFrames(); + } virtual lldb::StackFrameSP - GetStackFrameAtIndex (uint32_t idx); + GetStackFrameAtIndex (uint32_t idx) + { + return GetStackFrameList().GetFrameAtIndex(idx); + } virtual lldb::StackFrameSP GetFrameWithConcreteFrameIndex (uint32_t unwind_idx); virtual lldb::StackFrameSP - GetFrameWithStackID(StackID &stack_id); + GetFrameWithStackID(StackID &stack_id) + { + return GetStackFrameList().GetFrameWithStackID (stack_id); + } uint32_t - GetSelectedFrameIndex (); + GetSelectedFrameIndex () + { + return GetStackFrameList().GetSelectedFrameIndex(); + } lldb::StackFrameSP - GetSelectedFrame (); + GetSelectedFrame () + { + return GetStackFrameAtIndex (GetStackFrameList().GetSelectedFrameIndex()); + } uint32_t - SetSelectedFrame (lldb_private::StackFrame *frame); + SetSelectedFrame (lldb_private::StackFrame *frame) + { + return GetStackFrameList().SetSelectedFrame(frame); + } void - SetSelectedFrameByIndex (uint32_t frame_idx); + SetSelectedFrameByIndex (uint32_t frame_idx) + { + GetStackFrameList().SetSelectedFrameByIndex(frame_idx); + } + + void + SetDefaultFileAndLineToSelectedFrame() + { + GetStackFrameList().SetDefaultFileAndLineToSelectedFrame(); + } virtual lldb::RegisterContextSP GetRegisterContext () = 0; diff --git a/lldb/source/API/SBDebugger.cpp b/lldb/source/API/SBDebugger.cpp index 70ca8b286dba..be6873be414b 100644 --- a/lldb/source/API/SBDebugger.cpp +++ b/lldb/source/API/SBDebugger.cpp @@ -360,7 +360,7 @@ SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, SBSourceManager & SBDebugger::GetSourceManager () { - static SourceManager g_lldb_source_manager; + static SourceManager g_lldb_source_manager(NULL); static SBSourceManager g_sb_source_manager (&g_lldb_source_manager); return g_sb_source_manager; } diff --git a/lldb/source/API/SBSourceManager.cpp b/lldb/source/API/SBSourceManager.cpp index 16193dd027bc..0fa98e35dea2 100644 --- a/lldb/source/API/SBSourceManager.cpp +++ b/lldb/source/API/SBSourceManager.cpp @@ -61,8 +61,7 @@ SBSourceManager::DisplaySourceLinesWithLineNumbers if (file.IsValid()) { - return m_opaque_ptr->DisplaySourceLinesWithLineNumbers (NULL, - *file, + return m_opaque_ptr->DisplaySourceLinesWithLineNumbers (*file, line, context_before, context_after, diff --git a/lldb/source/API/SBThread.cpp b/lldb/source/API/SBThread.cpp index bcf85683ea85..90efc458da7c 100644 --- a/lldb/source/API/SBThread.cpp +++ b/lldb/source/API/SBThread.cpp @@ -32,7 +32,7 @@ #include "lldb/API/SBAddress.h" #include "lldb/API/SBFrame.h" -#include "lldb/API/SBSourceManager.h" +// DONT THINK THIS IS NECESSARY: #include "lldb/API/SBSourceManager.h" #include "lldb/API/SBDebugger.h" #include "lldb/API/SBProcess.h" diff --git a/lldb/source/Commands/CommandObjectBreakpoint.cpp b/lldb/source/Commands/CommandObjectBreakpoint.cpp index 2e894edae112..20641acf1172 100644 --- a/lldb/source/Commands/CommandObjectBreakpoint.cpp +++ b/lldb/source/Commands/CommandObjectBreakpoint.cpp @@ -321,31 +321,37 @@ CommandObjectBreakpointSet::Execute FileSpec file; if (m_options.m_filename.empty()) { - StackFrame *cur_frame = m_interpreter.GetExecutionContext().frame; - if (cur_frame == NULL) + uint32_t default_line; + // First use the Source Manager's default file. + // Then use the current stack frame's file. + if (!target->GetSourceManager().GetDefaultFileAndLine(file, default_line)) { - result.AppendError ("Attempting to set breakpoint by line number alone with no selected frame."); - result.SetStatus (eReturnStatusFailed); - break; - } - else if (!cur_frame->HasDebugInformation()) - { - result.AppendError ("Attempting to set breakpoint by line number alone but selected frame has no debug info."); - result.SetStatus (eReturnStatusFailed); - break; - } - else - { - const SymbolContext &sc = cur_frame->GetSymbolContext (eSymbolContextLineEntry); - if (sc.line_entry.file) + StackFrame *cur_frame = m_interpreter.GetExecutionContext().frame; + if (cur_frame == NULL) { - file = sc.line_entry.file; + result.AppendError ("Attempting to set breakpoint by line number alone with no selected frame."); + result.SetStatus (eReturnStatusFailed); + break; + } + else if (!cur_frame->HasDebugInformation()) + { + result.AppendError ("Attempting to set breakpoint by line number alone but selected frame has no debug info."); + result.SetStatus (eReturnStatusFailed); + break; } else { - result.AppendError ("Attempting to set breakpoint by line number alone but can't find the file for the selected frame."); - result.SetStatus (eReturnStatusFailed); - break; + const SymbolContext &sc = cur_frame->GetSymbolContext (eSymbolContextLineEntry); + if (sc.line_entry.file) + { + file = sc.line_entry.file; + } + else + { + result.AppendError ("Attempting to set breakpoint by line number alone but can't find the file for the selected frame."); + result.SetStatus (eReturnStatusFailed); + break; + } } } } diff --git a/lldb/source/Commands/CommandObjectSource.cpp b/lldb/source/Commands/CommandObjectSource.cpp index d534338e8c1d..e6b98faabab4 100644 --- a/lldb/source/Commands/CommandObjectSource.cpp +++ b/lldb/source/Commands/CommandObjectSource.cpp @@ -280,18 +280,23 @@ public: } ExecutionContext exe_ctx(m_interpreter.GetExecutionContext()); - + Target *target = NULL; + + if (exe_ctx.target) + target = exe_ctx.target; + else + target = m_interpreter.GetDebugger().GetSelectedTarget().get(); + + if (target == NULL) + { + result.AppendError ("invalid target, create a debug target using the 'target create' command"); + result.SetStatus (eReturnStatusFailed); + return false; + } + if (!m_options.symbol_name.empty()) { // Displaying the source for a symbol: - Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); - if (target == NULL) - { - result.AppendError ("invalid target, create a debug target using the 'target create' command"); - result.SetStatus (eReturnStatusFailed); - return false; - } - SymbolContextList sc_list; ConstString name(m_options.symbol_name.c_str()); bool include_symbols = false; @@ -418,7 +423,7 @@ public: char path_buf[PATH_MAX]; start_file.GetPath(path_buf, sizeof(path_buf)); - if (m_options.show_bp_locs && exe_ctx.target) + if (m_options.show_bp_locs) { const bool show_inlines = true; m_breakpoint_locations.Reset (start_file, 0, show_inlines); @@ -429,14 +434,13 @@ public: m_breakpoint_locations.Clear(); result.AppendMessageWithFormat("File: %s.\n", path_buf); - m_interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbers (target, - start_file, - line_no, - 0, - m_options.num_lines, - "", - &result.GetOutputStream(), - GetBreakpointLocations ()); + target->GetSourceManager().DisplaySourceLinesWithLineNumbers (start_file, + line_no, + 0, + m_options.num_lines, + "", + &result.GetOutputStream(), + GetBreakpointLocations ()); result.SetStatus (eReturnStatusSuccessFinishResult); return true; @@ -458,21 +462,21 @@ public: } else { - if (m_options.show_bp_locs && exe_ctx.target) + if (m_options.show_bp_locs) { - SourceManager::FileSP last_file_sp (m_interpreter.GetDebugger().GetSourceManager().GetLastFile ()); + SourceManager::FileSP last_file_sp (target->GetSourceManager().GetLastFile ()); if (last_file_sp) { const bool show_inlines = true; m_breakpoint_locations.Reset (last_file_sp->GetFileSpec(), 0, show_inlines); - SearchFilter target_search_filter (exe_ctx.target->GetSP()); + SearchFilter target_search_filter (target->GetSP()); target_search_filter.Search (m_breakpoint_locations); } } else m_breakpoint_locations.Clear(); - if (m_interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbersUsingLastFile( + if (target->GetSourceManager().DisplaySourceLinesWithLineNumbersUsingLastFile( m_options.start_line, // Line to display 0, // Lines before line to display m_options.num_lines, // Lines after line to display @@ -488,14 +492,6 @@ public: else { const char *filename = m_options.file_name.c_str(); - Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); - if (target == NULL) - { - result.AppendError ("invalid target, create a debug target using the 'target create' command"); - result.SetStatus (eReturnStatusFailed); - return false; - } - bool check_inlines = false; SymbolContextList sc_list; @@ -571,24 +567,23 @@ public: { if (sc.comp_unit) { - if (m_options.show_bp_locs && exe_ctx.target) + if (m_options.show_bp_locs) { const bool show_inlines = true; m_breakpoint_locations.Reset (*sc.comp_unit, 0, show_inlines); - SearchFilter target_search_filter (exe_ctx.target->GetSP()); + SearchFilter target_search_filter (target->GetSP()); target_search_filter.Search (m_breakpoint_locations); } else m_breakpoint_locations.Clear(); - m_interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbers (target, - sc.comp_unit, - m_options.start_line, - 0, - m_options.num_lines, - "", - &result.GetOutputStream(), - GetBreakpointLocations ()); + target->GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.comp_unit, + m_options.start_line, + 0, + m_options.num_lines, + "", + &result.GetOutputStream(), + GetBreakpointLocations ()); result.SetStatus (eReturnStatusSuccessFinishResult); } diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index c361dfc5e5ce..3213ba8ade3c 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -237,7 +237,7 @@ Debugger::Debugger () : m_target_list (), m_platform_list (), m_listener ("lldb.Debugger"), - m_source_manager (), + m_source_manager(NULL), m_command_interpreter_ap (new CommandInterpreter (*this, eScriptLanguageDefault, false)), m_input_reader_stack (), m_input_reader_data () diff --git a/lldb/source/Core/Disassembler.cpp b/lldb/source/Core/Disassembler.cpp index fbb0b71451b6..40b6c780b4f3 100644 --- a/lldb/source/Core/Disassembler.cpp +++ b/lldb/source/Core/Disassembler.cpp @@ -369,8 +369,7 @@ Disassembler::PrintInstructions if (sc.comp_unit && sc.line_entry.IsValid()) { - debugger.GetSourceManager().DisplaySourceLinesWithLineNumbers (debugger.GetTargetList().GetSelectedTarget().get(), - sc.line_entry.file, + debugger.GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.line_entry.file, sc.line_entry.line, num_mixed_context_lines, num_mixed_context_lines, diff --git a/lldb/source/Core/SourceManager.cpp b/lldb/source/Core/SourceManager.cpp index 5ceeee365d75..cdf98eb4e989 100644 --- a/lldb/source/Core/SourceManager.cpp +++ b/lldb/source/Core/SourceManager.cpp @@ -29,12 +29,13 @@ static inline bool is_newline_char(char ch) //---------------------------------------------------------------------- // SourceManager constructor //---------------------------------------------------------------------- -SourceManager::SourceManager() : +SourceManager::SourceManager(Target *target) : m_file_cache (), m_last_file_sp (), m_last_file_line (0), m_last_file_context_before (0), - m_last_file_context_after (0) + m_last_file_context_after (10), + m_target (target) { } @@ -48,7 +49,6 @@ SourceManager::~SourceManager() size_t SourceManager::DisplaySourceLines ( - Target *target, const FileSpec &file_spec, uint32_t line, uint32_t context_before, @@ -56,7 +56,7 @@ SourceManager::DisplaySourceLines Stream *s ) { - m_last_file_sp = GetFile (file_spec, target); + m_last_file_sp = GetFile (file_spec); m_last_file_line = line + context_after + 1; m_last_file_context_before = context_before; m_last_file_context_after = context_after; @@ -67,7 +67,7 @@ SourceManager::DisplaySourceLines } SourceManager::FileSP -SourceManager::GetFile (const FileSpec &file_spec, Target *target) +SourceManager::GetFile (const FileSpec &file_spec) { FileSP file_sp; FileCache::iterator pos = m_file_cache.find(file_spec); @@ -75,7 +75,7 @@ SourceManager::GetFile (const FileSpec &file_spec, Target *target) file_sp = pos->second; else { - file_sp.reset (new File (file_spec, target)); + file_sp.reset (new File (file_spec, m_target)); m_file_cache[file_spec] = file_sp; } return file_sp; @@ -151,7 +151,6 @@ SourceManager::DisplaySourceLinesWithLineNumbersUsingLastFile size_t SourceManager::DisplaySourceLinesWithLineNumbers ( - Target *target, const FileSpec &file_spec, uint32_t line, uint32_t context_before, @@ -164,7 +163,7 @@ SourceManager::DisplaySourceLinesWithLineNumbers bool same_as_previous = m_last_file_sp && m_last_file_sp->FileSpecMatches (file_spec); if (!same_as_previous) - m_last_file_sp = GetFile (file_spec, target); + m_last_file_sp = GetFile (file_spec); if (line == 0) { @@ -187,6 +186,35 @@ SourceManager::DisplayMoreWithLineNumbers (Stream *s, const SymbolContextList *b return 0; } +bool +SourceManager::SetDefaultFileAndLine (const FileSpec &file_spec, uint32_t line) +{ + FileSP old_file_sp = m_last_file_sp; + m_last_file_sp = GetFile (file_spec); + if (m_last_file_sp) + { + m_last_file_line = line; + return true; + } + else + { + m_last_file_sp = old_file_sp; + return false; + } +} + +bool +SourceManager::GetDefaultFileAndLine (FileSpec &file_spec, uint32_t &line) +{ + if (m_last_file_sp) + { + file_spec = m_last_file_sp->GetFileSpec(); + line = m_last_file_line; + return true; + } + else + return false; +} SourceManager::File::File(const FileSpec &file_spec, Target *target) : @@ -198,7 +226,7 @@ SourceManager::File::File(const FileSpec &file_spec, Target *target) : { if (!m_mod_time.IsValid()) { - if (target->GetSourcePathMap().RemapPath(file_spec.GetDirectory(), m_file_spec.GetDirectory())) + if (target && target->GetSourcePathMap().RemapPath(file_spec.GetDirectory(), m_file_spec.GetDirectory())) m_mod_time = file_spec.GetModificationTime(); } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp index 479a662ba440..fb34d4d5651e 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp @@ -792,22 +792,27 @@ DWARFCompileUnit::Index { if (name) { - ConstString objc_class_name; - ConstString objc_method_name; - ConstString objc_base_name; - if (ObjCLanguageRuntime::ParseMethodName (name, - &objc_class_name, - &objc_method_name, - &objc_base_name)) + // Note, this check is also done in ParseMethodName, but since this is a hot loop, we do the + // simple inlined check outside the call. + if (ObjCLanguageRuntime::IsPossibleObjCMethodName(name)) { - objc_class_selectors.Insert(objc_class_name, die_info); - - func_selectors.Insert (objc_method_name, die_info); - - if (!objc_base_name.IsEmpty()) + ConstString objc_class_name; + ConstString objc_method_name; + ConstString objc_base_name; + if (ObjCLanguageRuntime::ParseMethodName (name, + &objc_class_name, + &objc_method_name, + &objc_base_name)) { - func_basenames.Insert (objc_base_name, die_info); - func_fullnames.Insert (objc_base_name, die_info); + objc_class_selectors.Insert(objc_class_name, die_info); + + func_selectors.Insert (objc_method_name, die_info); + + if (!objc_base_name.IsEmpty()) + { + func_basenames.Insert (objc_base_name, die_info); + func_fullnames.Insert (objc_base_name, die_info); + } } } // If we have a mangled name, then the DW_AT_name attribute diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 43ccbbdfe04b..353c00b23f1d 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -42,6 +42,8 @@ #include "lldb/Symbol/SymbolVendor.h" #include "lldb/Symbol/VariableList.h" +#include "lldb/Target/ObjCLanguageRuntime.h" + #include "DWARFCompileUnit.h" #include "DWARFDebugAbbrev.h" #include "DWARFDebugAranges.h" @@ -3789,7 +3791,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, bool type_handled = false; if (tag == DW_TAG_subprogram) { - if (type_name_cstr[1] == '[' && (type_name_cstr[0] == '-' || type_name_cstr[0] == '+')) + if (ObjCLanguageRuntime::IsPossibleObjCMethodName (type_name_cstr)) { // We need to find the DW_TAG_class_type or // DW_TAG_struct_type by name so we can add this diff --git a/lldb/source/Target/ObjCLanguageRuntime.cpp b/lldb/source/Target/ObjCLanguageRuntime.cpp index 4326910f1cd5..a9e692d9e43b 100644 --- a/lldb/source/Target/ObjCLanguageRuntime.cpp +++ b/lldb/source/Target/ObjCLanguageRuntime.cpp @@ -111,7 +111,7 @@ ObjCLanguageRuntime::ParseMethodName (const char *name, if (method_name) { method_name->Clear(); } if (base_name) { base_name->Clear(); } - if (name && (name[0] == '-' || name[0] == '+') && name[1] == '[') + if (IsPossibleObjCMethodName (name)) { int name_len = strlen (name); // Objective C methods must have at least: diff --git a/lldb/source/Target/StackFrame.cpp b/lldb/source/Target/StackFrame.cpp index 0e6b02f5656e..862e4c99082f 100644 --- a/lldb/source/Target/StackFrame.cpp +++ b/lldb/source/Target/StackFrame.cpp @@ -1282,8 +1282,7 @@ StackFrame::GetStatus (Stream& strm, if (m_sc.comp_unit && m_sc.line_entry.IsValid()) { Target &target = GetThread().GetProcess().GetTarget(); - target.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbers ( - &target, + target.GetSourceManager().DisplaySourceLinesWithLineNumbers ( m_sc.line_entry.file, m_sc.line_entry.line, 3, diff --git a/lldb/source/Target/StackFrameList.cpp b/lldb/source/Target/StackFrameList.cpp index 660bdcc84880..a19106e2098b 100644 --- a/lldb/source/Target/StackFrameList.cpp +++ b/lldb/source/Target/StackFrameList.cpp @@ -14,11 +14,14 @@ // Other libraries and framework includes // Project includes #include "lldb/Core/StreamFile.h" +#include "lldb/Core/SourceManager.h" #include "lldb/Symbol/Block.h" #include "lldb/Symbol/Function.h" #include "lldb/Symbol/Symbol.h" +#include "lldb/Target/Process.h" #include "lldb/Target/RegisterContext.h" #include "lldb/Target/StackFrame.h" +#include "lldb/Target/Target.h" #include "lldb/Target/Thread.h" #include "lldb/Target/Unwind.h" @@ -401,15 +404,16 @@ StackFrameList::SetSelectedFrame (lldb_private::StackFrame *frame) const_iterator pos; const_iterator begin = m_frames.begin(); const_iterator end = m_frames.end(); + m_selected_frame_idx = 0; for (pos = begin; pos != end; ++pos) { if (pos->get() == frame) { m_selected_frame_idx = std::distance (begin, pos); - return m_selected_frame_idx; + break; } } - m_selected_frame_idx = 0; + SetDefaultFileAndLineToSelectedFrame(); return m_selected_frame_idx; } @@ -419,6 +423,22 @@ StackFrameList::SetSelectedFrameByIndex (uint32_t idx) { Mutex::Locker locker (m_mutex); m_selected_frame_idx = idx; + SetDefaultFileAndLineToSelectedFrame(); +} + +void +StackFrameList::SetDefaultFileAndLineToSelectedFrame() +{ + if (m_thread.GetID() == m_thread.GetProcess().GetThreadList().GetSelectedThread()->GetID()) + { + StackFrameSP frame_sp = m_frames[m_selected_frame_idx]; + if (frame_sp) + { + SymbolContext sc = frame_sp->GetSymbolContext(eSymbolContextEverything); + if (sc.line_entry.file) + m_thread.GetProcess().GetTarget().GetSourceManager().SetDefaultFileAndLine (sc.line_entry.file, sc.line_entry.line); + } + } } // The thread has been run, reset the number stack frames to zero so we can diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index 00192a56c8e9..a236d71bdc4f 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -59,6 +59,7 @@ Target::Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::Plat m_image_search_paths (ImageSearchPathsChanged, this), m_scratch_ast_context_ap (NULL), m_persistent_variables (), + m_source_manager(this), m_stop_hooks (), m_stop_hook_next_id (0), m_suppress_stop_hooks (false) @@ -469,6 +470,26 @@ Target::SetExecutableModule (ModuleSP& executable_sp, bool get_dependent_files) FileSpecList dependent_files; ObjectFile *executable_objfile = executable_sp->GetObjectFile(); + // Let's find the file & line for main and set the default source file from there. + if (!m_source_manager.DefaultFileAndLineSet()) + { + SymbolContextList sc_list; + uint32_t num_matches; + ConstString main_name("main"); + bool symbols_okay = false; // Force it to be a debug symbol. + bool append = false; + num_matches = executable_sp->FindFunctions (main_name, eFunctionNameTypeBase, symbols_okay, append, sc_list); + for (uint32_t idx = 0; idx < num_matches; idx++) + { + SymbolContext sc; + sc_list.GetContextAtIndex(idx, sc); + if (sc.line_entry.file) + { + m_source_manager.SetDefaultFileAndLine(sc.line_entry.file, sc.line_entry.line); + break; + } + } + } if (executable_objfile) { diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp index 13d21936fc46..babb2dd6848b 100644 --- a/lldb/source/Target/Thread.cpp +++ b/lldb/source/Target/Thread.cpp @@ -925,15 +925,6 @@ Thread::GetStackFrameList () return *m_curr_frames_sp; } - - -uint32_t -Thread::GetStackFrameCount() -{ - return GetStackFrameList().GetNumFrames(); -} - - void Thread::ClearStackFrames () { @@ -942,49 +933,12 @@ Thread::ClearStackFrames () m_curr_frames_sp.reset(); } -lldb::StackFrameSP -Thread::GetStackFrameAtIndex (uint32_t idx) -{ - return GetStackFrameList().GetFrameAtIndex(idx); -} - -uint32_t -Thread::GetSelectedFrameIndex () -{ - return GetStackFrameList().GetSelectedFrameIndex(); -} - lldb::StackFrameSP Thread::GetFrameWithConcreteFrameIndex (uint32_t unwind_idx) { return GetStackFrameList().GetFrameWithConcreteFrameIndex (unwind_idx); } -lldb::StackFrameSP -Thread::GetFrameWithStackID(StackID &stack_id) -{ - return GetStackFrameList().GetFrameWithStackID (stack_id); -} - - -lldb::StackFrameSP -Thread::GetSelectedFrame () -{ - return GetStackFrameAtIndex (GetStackFrameList().GetSelectedFrameIndex()); -} - -uint32_t -Thread::SetSelectedFrame (lldb_private::StackFrame *frame) -{ - return GetStackFrameList().SetSelectedFrame(frame); -} - -void -Thread::SetSelectedFrameByIndex (uint32_t idx) -{ - GetStackFrameList().SetSelectedFrameByIndex(idx); -} - void Thread::DumpUsingSettingsFormat (Stream &strm, uint32_t frame_idx) { diff --git a/lldb/source/Target/ThreadList.cpp b/lldb/source/Target/ThreadList.cpp index 79df0f2184e0..12d78b53b4ae 100644 --- a/lldb/source/Target/ThreadList.cpp +++ b/lldb/source/Target/ThreadList.cpp @@ -558,8 +558,12 @@ bool ThreadList::SetSelectedThreadByID (lldb::tid_t tid) { Mutex::Locker locker(m_threads_mutex); - if (FindThreadByID(tid).get()) + ThreadSP selected_thread_sp(FindThreadByID(tid)); + if (selected_thread_sp) + { m_selected_tid = tid; + selected_thread_sp->SetDefaultFileAndLineToSelectedFrame(); + } else m_selected_tid = LLDB_INVALID_THREAD_ID; @@ -570,9 +574,12 @@ bool ThreadList::SetSelectedThreadByIndexID (uint32_t index_id) { Mutex::Locker locker(m_threads_mutex); - ThreadSP thread_sp (FindThreadByIndexID(index_id)); - if (thread_sp.get()) - m_selected_tid = thread_sp->GetID(); + ThreadSP selected_thread_sp (FindThreadByIndexID(index_id)); + if (selected_thread_sp.get()) + { + m_selected_tid = selected_thread_sp->GetID(); + selected_thread_sp->SetDefaultFileAndLineToSelectedFrame(); + } else m_selected_tid = LLDB_INVALID_THREAD_ID; diff --git a/lldb/test/functionalities/breakpoint/breakpoint_command/TestBreakpointCommand.py b/lldb/test/functionalities/breakpoint/breakpoint_command/TestBreakpointCommand.py index fc393892504f..b96d20d37df9 100644 --- a/lldb/test/functionalities/breakpoint/breakpoint_command/TestBreakpointCommand.py +++ b/lldb/test/functionalities/breakpoint/breakpoint_command/TestBreakpointCommand.py @@ -40,8 +40,9 @@ class BreakpointCommandTestCase(TestBase): exe = os.path.join(os.getcwd(), "a.out") self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) - # Add two breakpoints on the same line. - self.expect("breakpoint set -f main.c -l %d" % self.line, + # Add two breakpoints on the same line. The first time we don't specify the file, + # since the default file is the one containing main: + self.expect("breakpoint set -l %d" % self.line, BREAKPOINT_CREATED, startstr = "Breakpoint created: 1: file ='main.c', line = %d, locations = 1" % self.line)