summaryrefslogtreecommitdiffstats
path: root/lldb
diff options
context:
space:
mode:
Diffstat (limited to 'lldb')
-rw-r--r--lldb/include/lldb/Breakpoint/BreakpointResolverName.h14
-rw-r--r--lldb/include/lldb/Core/Module.h8
-rw-r--r--lldb/include/lldb/Core/ModuleList.h7
-rw-r--r--lldb/include/lldb/Core/VMRange.h2
-rw-r--r--lldb/include/lldb/Symbol/Block.h36
-rw-r--r--lldb/include/lldb/Symbol/CompileUnit.h4
-rw-r--r--lldb/include/lldb/Symbol/Function.h3
-rw-r--r--lldb/include/lldb/Symbol/LineEntry.h8
-rw-r--r--lldb/include/lldb/Symbol/Symbol.h3
-rw-r--r--lldb/include/lldb/Symbol/SymbolContext.h6
-rw-r--r--lldb/include/lldb/Symbol/SymbolFile.h2
-rw-r--r--lldb/include/lldb/Symbol/SymbolVendor.h1
-rw-r--r--lldb/include/lldb/Symbol/Type.h4
-rw-r--r--lldb/include/lldb/Target/Target.h1
-rw-r--r--lldb/include/lldb/lldb-enumerations.h14
-rw-r--r--lldb/lldb.xcodeproj/project.pbxproj8
-rw-r--r--lldb/source/Breakpoint/Breakpoint.cpp21
-rw-r--r--lldb/source/Breakpoint/BreakpointOptions.cpp10
-rw-r--r--lldb/source/Breakpoint/BreakpointResolverAddress.cpp2
-rw-r--r--lldb/source/Breakpoint/BreakpointResolverFileLine.cpp2
-rw-r--r--lldb/source/Breakpoint/BreakpointResolverName.cpp72
-rw-r--r--lldb/source/Commands/CommandObjectBreakpoint.cpp115
-rw-r--r--lldb/source/Commands/CommandObjectBreakpoint.h5
-rw-r--r--lldb/source/Commands/CommandObjectCall.cpp2
-rw-r--r--lldb/source/Commands/CommandObjectDisassemble.cpp4
-rw-r--r--lldb/source/Commands/CommandObjectExpression.cpp2
-rw-r--r--lldb/source/Commands/CommandObjectImage.cpp9
-rw-r--r--lldb/source/Commands/CommandObjectThread.cpp10
-rw-r--r--lldb/source/Core/Address.cpp3
-rw-r--r--lldb/source/Core/AddressResolverName.cpp17
-rw-r--r--lldb/source/Core/Module.cpp4
-rw-r--r--lldb/source/Core/ModuleList.cpp4
-rw-r--r--lldb/source/Core/SearchFilter.cpp3
-rw-r--r--lldb/source/Core/VMRange.cpp4
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp70
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h11
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp96
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h13
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp4
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h2
-rw-r--r--lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp2
-rw-r--r--lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h2
-rw-r--r--lldb/source/Symbol/Block.cpp78
-rw-r--r--lldb/source/Symbol/CompileUnit.cpp7
-rw-r--r--lldb/source/Symbol/Declaration.cpp3
-rw-r--r--lldb/source/Symbol/Function.cpp10
-rw-r--r--lldb/source/Symbol/LineEntry.cpp19
-rw-r--r--lldb/source/Symbol/LineTable.cpp2
-rw-r--r--lldb/source/Symbol/Symbol.cpp20
-rw-r--r--lldb/source/Symbol/SymbolContext.cpp121
-rw-r--r--lldb/source/Symbol/SymbolVendor.cpp4
-rw-r--r--lldb/source/Symbol/Type.cpp89
-rw-r--r--lldb/source/Target/Target.cpp13
-rw-r--r--lldb/tools/driver/Driver.cpp12
54 files changed, 718 insertions, 270 deletions
diff --git a/lldb/include/lldb/Breakpoint/BreakpointResolverName.h b/lldb/include/lldb/Breakpoint/BreakpointResolverName.h
index 63e6b86837a..4cfd2458dd6 100644
--- a/lldb/include/lldb/Breakpoint/BreakpointResolverName.h
+++ b/lldb/include/lldb/Breakpoint/BreakpointResolverName.h
@@ -30,17 +30,18 @@ class BreakpointResolverName:
public:
BreakpointResolverName (Breakpoint *bkpt,
- const char *func_name,
- Breakpoint::MatchType type = Breakpoint::Exact);
+ const char *name,
+ uint32_t name_type_mask,
+ Breakpoint::MatchType type);
// Creates a function breakpoint by regular expression. Takes over control of the lifespan of func_regex.
BreakpointResolverName (Breakpoint *bkpt,
- RegularExpression &func_regex);
+ RegularExpression &func_regex);
BreakpointResolverName (Breakpoint *bkpt,
- const char *class_name,
- const char *method,
- Breakpoint::MatchType type);
+ const char *class_name,
+ const char *method,
+ Breakpoint::MatchType type);
virtual
~BreakpointResolverName ();
@@ -62,6 +63,7 @@ public:
protected:
ConstString m_func_name;
+ uint32_t m_func_name_type_mask; // See FunctionNameType
ConstString m_class_name; // FIXME: Not used yet. The idea would be to stop on methods of this class.
RegularExpression m_regex;
Breakpoint::MatchType m_match_type;
diff --git a/lldb/include/lldb/Core/Module.h b/lldb/include/lldb/Core/Module.h
index d985ae9495f..9de406d59eb 100644
--- a/lldb/include/lldb/Core/Module.h
+++ b/lldb/include/lldb/Core/Module.h
@@ -157,6 +157,12 @@ public:
/// @param[in] name
/// The name of the function we are looking for.
///
+ /// @param[in] name_type_mask
+ /// A bit mask of bits that indicate what kind of names should
+ /// be used when doing the lookup. Bits include fully qualified
+ /// names, base names, C++ methods, or ObjC selectors.
+ /// See FunctionNameType for more details.
+ ///
/// @param[in] append
/// If \b true, any matches will be appended to \a
/// variable_list, else matches replace the contents of
@@ -170,7 +176,7 @@ public:
/// The number of matches added to \a sc_list.
//------------------------------------------------------------------
uint32_t
- FindFunctions (const ConstString &name, bool append, SymbolContextList& sc_list);
+ FindFunctions (const ConstString &name, uint32_t name_type_mask, bool append, SymbolContextList& sc_list);
//------------------------------------------------------------------
/// Find functions by name.
diff --git a/lldb/include/lldb/Core/ModuleList.h b/lldb/include/lldb/Core/ModuleList.h
index e4959023857..6a392b1e120 100644
--- a/lldb/include/lldb/Core/ModuleList.h
+++ b/lldb/include/lldb/Core/ModuleList.h
@@ -144,6 +144,12 @@ public:
/// @param[in] name
/// The name of the function we are looking for.
///
+ /// @param[in] name_type_mask
+ /// A bit mask of bits that indicate what kind of names should
+ /// be used when doing the lookup. Bits include fully qualified
+ /// names, base names, C++ methods, or ObjC selectors.
+ /// See FunctionNameType for more details.
+ ///
/// @param[out] sc_list
/// A symbol context list that gets filled in with all of the
/// matches.
@@ -153,6 +159,7 @@ public:
//------------------------------------------------------------------
size_t
FindFunctions (const ConstString &name,
+ uint32_t name_type_mask,
SymbolContextList &sc_list);
//------------------------------------------------------------------
diff --git a/lldb/include/lldb/Core/VMRange.h b/lldb/include/lldb/Core/VMRange.h
index b97059f2577..c0bba12c3a9 100644
--- a/lldb/include/lldb/Core/VMRange.h
+++ b/lldb/include/lldb/Core/VMRange.h
@@ -112,7 +112,7 @@ public:
}
void
- Dump(Stream *s, lldb::addr_t base_addr = 0) const;
+ Dump (Stream *s, lldb::addr_t base_addr = 0, uint32_t addr_width = 8) const;
class ValueInRangeUnaryPredicate
{
diff --git a/lldb/include/lldb/Symbol/Block.h b/lldb/include/lldb/Symbol/Block.h
index 85c981c7355..13c5d38d7e7 100644
--- a/lldb/include/lldb/Symbol/Block.h
+++ b/lldb/include/lldb/Symbol/Block.h
@@ -213,6 +213,11 @@ public:
virtual void
DumpSymbolContext(Stream *s);
+ void
+ GetDescription (Stream *s,
+ lldb::DescriptionLevel level,
+ Process *process) const;
+
//------------------------------------------------------------------
/// Get the parent block's UID.
///
@@ -243,6 +248,37 @@ public:
lldb::user_id_t
GetFirstChildUID () const;
+
+ //------------------------------------------------------------------
+ /// Get the parent block.
+ ///
+ /// @return
+ /// The parent block pointer, or NULL if this block has no
+ /// parent.
+ //------------------------------------------------------------------
+ Block *
+ GetParent () const;
+
+ //------------------------------------------------------------------
+ /// Get the sibling block.
+ ///
+ /// @return
+ /// The sibling block pointer, or NULL if this block has no
+ /// sibling.
+ //------------------------------------------------------------------
+ Block *
+ GetSibling () const;
+
+ //------------------------------------------------------------------
+ /// Get the first child block.
+ ///
+ /// @return
+ /// The first child block pointer, or NULL if this block has no
+ /// children.
+ //------------------------------------------------------------------
+ Block *
+ GetFirstChild () const;
+
//------------------------------------------------------------------
/// Get the variable list for this block and optionally all child
/// blocks if \a get_child_variables is \b true.
diff --git a/lldb/include/lldb/Symbol/CompileUnit.h b/lldb/include/lldb/Symbol/CompileUnit.h
index ab1b58783ce..779363fd8b7 100644
--- a/lldb/include/lldb/Symbol/CompileUnit.h
+++ b/lldb/include/lldb/Symbol/CompileUnit.h
@@ -135,6 +135,10 @@ public:
virtual void
DumpSymbolContext(Stream *s);
+
+ void
+ GetDescription(Stream *s, lldb::DescriptionLevel level) const;
+
//------------------------------------------------------------------
/// Get a shared pointer to a function in this compile unit by
/// index.
diff --git a/lldb/include/lldb/Symbol/Function.h b/lldb/include/lldb/Symbol/Function.h
index f52bcf07183..b4c1e8be742 100644
--- a/lldb/include/lldb/Symbol/Function.h
+++ b/lldb/include/lldb/Symbol/Function.h
@@ -451,6 +451,9 @@ public:
const CompileUnit*
GetCompileUnit() const;
+ void
+ GetDescription(Stream *s, lldb::DescriptionLevel level, Process *process);
+
//------------------------------------------------------------------
/// Get accessor for the frame base location.
///
diff --git a/lldb/include/lldb/Symbol/LineEntry.h b/lldb/include/lldb/Symbol/LineEntry.h
index e0e6d2941d1..f9e685ec056 100644
--- a/lldb/include/lldb/Symbol/LineEntry.h
+++ b/lldb/include/lldb/Symbol/LineEntry.h
@@ -87,8 +87,12 @@ struct LineEntry
Dump (Stream *s, Process *process, bool show_file, Address::DumpStyle style, Address::DumpStyle fallback_style, bool show_range) const;
bool
- GetDescription (Stream *s, lldb::DescriptionLevel level, CompileUnit* cu, Process *process) const;
-
+ GetDescription (Stream *s,
+ lldb::DescriptionLevel level,
+ CompileUnit* cu,
+ Process *process,
+ bool show_address_only) const;
+
//------------------------------------------------------------------
/// Dumps information specific to a process that stops at this
/// line entry to the supplied stream \a s.
diff --git a/lldb/include/lldb/Symbol/Symbol.h b/lldb/include/lldb/Symbol/Symbol.h
index dedc4516224..ee4c2b4b7b7 100644
--- a/lldb/include/lldb/Symbol/Symbol.h
+++ b/lldb/include/lldb/Symbol/Symbol.h
@@ -106,6 +106,9 @@ public:
void
SetFlags (uint32_t flags) { m_flags = flags; }
+ void
+ GetDescription (Stream *s, lldb::DescriptionLevel level, Process *process) const;
+
Function *
GetFunction ();
diff --git a/lldb/include/lldb/Symbol/SymbolContext.h b/lldb/include/lldb/Symbol/SymbolContext.h
index c0aff6ea4a7..be3ee3c2f75 100644
--- a/lldb/include/lldb/Symbol/SymbolContext.h
+++ b/lldb/include/lldb/Symbol/SymbolContext.h
@@ -184,6 +184,12 @@ public:
bool
GetAddressRange (uint32_t scope, AddressRange &range) const;
+
+ void
+ GetDescription(Stream *s,
+ lldb::DescriptionLevel level,
+ Process *process) const;
+
//------------------------------------------------------------------
/// Find a function matching the given name, working out from this
/// symbol context.
diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h
index 4af88c31b06..b1faee654d7 100644
--- a/lldb/include/lldb/Symbol/SymbolFile.h
+++ b/lldb/include/lldb/Symbol/SymbolFile.h
@@ -75,7 +75,7 @@ public:
virtual uint32_t ResolveSymbolContext (const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) = 0;
virtual uint32_t FindGlobalVariables (const ConstString &name, bool append, uint32_t max_matches, VariableList& variables) = 0;
virtual uint32_t FindGlobalVariables (const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) = 0;
- virtual uint32_t FindFunctions (const ConstString &name, bool append, SymbolContextList& sc_list) = 0;
+ virtual uint32_t FindFunctions (const ConstString &name, uint32_t name_type_mask, bool append, SymbolContextList& sc_list) = 0;
virtual uint32_t FindFunctions (const RegularExpression& regex, bool append, SymbolContextList& sc_list) = 0;
// virtual uint32_t FindTypes (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, Type::Encoding encoding, lldb::user_id_t udt_uid, TypeList& types) = 0;
// virtual uint32_t FindTypes (const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, lldb::user_id_t udt_uid, TypeList& types) = 0;
diff --git a/lldb/include/lldb/Symbol/SymbolVendor.h b/lldb/include/lldb/Symbol/SymbolVendor.h
index a5bdb3b30b1..11922c215ce 100644
--- a/lldb/include/lldb/Symbol/SymbolVendor.h
+++ b/lldb/include/lldb/Symbol/SymbolVendor.h
@@ -110,6 +110,7 @@ public:
virtual uint32_t
FindFunctions(const ConstString &name,
+ uint32_t name_type_mask,
bool append,
SymbolContextList& sc_list);
diff --git a/lldb/include/lldb/Symbol/Type.h b/lldb/include/lldb/Symbol/Type.h
index 9d7810af9c0..c25675ee584 100644
--- a/lldb/include/lldb/Symbol/Type.h
+++ b/lldb/include/lldb/Symbol/Type.h
@@ -58,6 +58,10 @@ public:
void
DumpTypeName(Stream *s);
+
+ void
+ GetDescription (Stream *s, lldb::DescriptionLevel level, bool show_name);
+
SymbolFile *
GetSymbolFile()
{
diff --git a/lldb/include/lldb/Target/Target.h b/lldb/include/lldb/Target/Target.h
index 6f5f05e2ba7..055b5cf3353 100644
--- a/lldb/include/lldb/Target/Target.h
+++ b/lldb/include/lldb/Target/Target.h
@@ -138,6 +138,7 @@ public:
lldb::BreakpointSP
CreateBreakpoint (FileSpec *containingModule,
const char *func_name,
+ uint32_t func_name_type_mask,
bool internal = false);
// Use this to create a general breakpoint:
diff --git a/lldb/include/lldb/lldb-enumerations.h b/lldb/include/lldb/lldb-enumerations.h
index cf0237a3989..17622a83f95 100644
--- a/lldb/include/lldb/lldb-enumerations.h
+++ b/lldb/include/lldb/lldb-enumerations.h
@@ -390,6 +390,20 @@ typedef enum ArchitectureType
kNumArchTypes
} ArchitectureType;
+typedef enum FunctionNameType
+{
+ eFunctionNameTypeNone = 0,
+ eFunctionNameTypeFull = (1 << 1), // The function name.
+ // For C this is the same as just the name of the function
+ // For C++ this is the demangled version of the mangled name.
+ // For ObjC this is the full function signature with the + or
+ // - and the square brackets and the class and selector
+ eFunctionNameTypeBase = (1 << 2), // The function name only, no namespaces or arguments and no class
+ // methods or selectors will be searched.
+ eFunctionNameTypeMethod = (1 << 3), // Find function by method name (C++) with no namespace or arguments
+ eFunctionNameTypeSelector = (1 << 4) // Find function by selector name (ObjC) names
+} FunctionNameType;
+
} // namespace lldb
diff --git a/lldb/lldb.xcodeproj/project.pbxproj b/lldb/lldb.xcodeproj/project.pbxproj
index 7f235690ef0..db04ce6ceef 100644
--- a/lldb/lldb.xcodeproj/project.pbxproj
+++ b/lldb/lldb.xcodeproj/project.pbxproj
@@ -1621,6 +1621,8 @@
26BC7E9310F1B85900F91463 /* StreamString.cpp */,
9A35765E116E76A700E8ED2F /* StringList.h */,
9A35765F116E76B900E8ED2F /* StringList.cpp */,
+ 26B167A41123BF5500DC7B4F /* ThreadSafeValue.h */,
+ 263FEDA5112CC1DA00E4C208 /* ThreadSafeSTLMap.h */,
26BC7D7E10F1B77400F91463 /* Timer.h */,
26BC7E9610F1B85900F91463 /* Timer.cpp */,
26BC7D7F10F1B77400F91463 /* TTYState.h */,
@@ -1628,6 +1630,8 @@
268A813F115B19D000F645B0 /* UniqueCStringMap.h */,
26BC7D8010F1B77400F91463 /* UserID.h */,
26BC7E9810F1B85900F91463 /* UserID.cpp */,
+ 26C81CA411335651004BDC5A /* UUID.h */,
+ 26C81CA511335651004BDC5A /* UUID.cpp */,
26BC7D8110F1B77400F91463 /* Value.h */,
26BC7E9910F1B85900F91463 /* Value.cpp */,
26BC7D8210F1B77400F91463 /* ValueObject.h */,
@@ -1642,10 +1646,6 @@
26BC7E9D10F1B85900F91463 /* ValueObjectVariable.cpp */,
26BC7D8610F1B77400F91463 /* VMRange.h */,
26BC7E9E10F1B85900F91463 /* VMRange.cpp */,
- 26B167A41123BF5500DC7B4F /* ThreadSafeValue.h */,
- 263FEDA5112CC1DA00E4C208 /* ThreadSafeSTLMap.h */,
- 26C81CA411335651004BDC5A /* UUID.h */,
- 26C81CA511335651004BDC5A /* UUID.cpp */,
);
name = Core;
sourceTree = "<group>";
diff --git a/lldb/source/Breakpoint/Breakpoint.cpp b/lldb/source/Breakpoint/Breakpoint.cpp
index fb277b223ba..12dceac7476 100644
--- a/lldb/source/Breakpoint/Breakpoint.cpp
+++ b/lldb/source/Breakpoint/Breakpoint.cpp
@@ -349,17 +349,9 @@ void
Breakpoint::GetDescription (Stream *s, lldb::DescriptionLevel level, bool show_locations)
{
assert (s != NULL);
- StreamString filter_strm;
-
-
- s->Printf("%i ", GetID());
+ s->Printf("%i: ", GetID());
GetResolverDescription (s);
- GetFilterDescription (&filter_strm);
- if (filter_strm.GetString().compare ("No Filter") != 0)
- {
- s->Printf (", ");
- GetFilterDescription (s);
- }
+ GetFilterDescription (s);
const uint32_t num_locations = GetNumLocations ();
const uint32_t num_resolved_locations = GetNumResolvedLocations ();
@@ -370,14 +362,13 @@ Breakpoint::GetDescription (Stream *s, lldb::DescriptionLevel level, bool show_l
case lldb::eDescriptionLevelFull:
if (num_locations > 0)
{
- s->Printf(" with %u location%s", num_locations, num_locations > 1 ? "s" : "");
+ s->Printf(", locations = %u", num_locations);
if (num_resolved_locations > 0)
- s->Printf(" (%u resolved)", num_resolved_locations);
- s->PutChar(';');
+ s->Printf(", resolved = %u", num_resolved_locations);
}
else
{
- s->Printf(" with 0 locations (Pending Breakpoint).");
+ s->Printf(", locations = 0 (pending)");
}
GetOptions()->GetDescription(s, level);
@@ -400,7 +391,6 @@ Breakpoint::GetDescription (Stream *s, lldb::DescriptionLevel level, bool show_l
if (show_locations)
{
- s->EOL();
s->IndentMore();
for (int i = 0; i < GetNumLocations(); ++i)
{
@@ -409,7 +399,6 @@ Breakpoint::GetDescription (Stream *s, lldb::DescriptionLevel level, bool show_l
s->EOL();
}
s->IndentLess();
-
}
}
diff --git a/lldb/source/Breakpoint/BreakpointOptions.cpp b/lldb/source/Breakpoint/BreakpointOptions.cpp
index fae9a7bfba9..aa89c442bea 100644
--- a/lldb/source/Breakpoint/BreakpointOptions.cpp
+++ b/lldb/source/Breakpoint/BreakpointOptions.cpp
@@ -234,10 +234,7 @@ BreakpointOptions::GetDescription (Stream *s, lldb::DescriptionLevel level) cons
if (level != eDescriptionLevelBrief)
s->EOL();
m_callback_baton_sp->GetDescription (s, level);
- }
- else if (level == eDescriptionLevelBrief)
- s->PutCString ("commands: no ");
-
+ }
}
void
@@ -247,10 +244,7 @@ BreakpointOptions::CommandBaton::GetDescription (Stream *s, lldb::DescriptionLev
if (level == eDescriptionLevelBrief)
{
- if (data && data->user_source.GetSize() > 0)
- s->PutCString("commands: yes ");
- else
- s->PutCString("commands: no ");
+ s->Printf (", commands = %s", (data && data->user_source.GetSize() > 0) ? "yes" : "no");
return;
}
diff --git a/lldb/source/Breakpoint/BreakpointResolverAddress.cpp b/lldb/source/Breakpoint/BreakpointResolverAddress.cpp
index 034ef601dc4..3e462d0c9fb 100644
--- a/lldb/source/Breakpoint/BreakpointResolverAddress.cpp
+++ b/lldb/source/Breakpoint/BreakpointResolverAddress.cpp
@@ -100,7 +100,7 @@ BreakpointResolverAddress::GetDepth()
void
BreakpointResolverAddress::GetDescription (Stream *s)
{
- s->PutCString ("Address breakpoint: ");
+ s->PutCString ("address = ");
m_addr.Dump(s, m_breakpoint->GetTarget().GetProcessSP().get(), Address::DumpStyleLoadAddress, Address::DumpStyleModuleWithFileAddress);
}
diff --git a/lldb/source/Breakpoint/BreakpointResolverFileLine.cpp b/lldb/source/Breakpoint/BreakpointResolverFileLine.cpp
index 86e05964485..da015dc8191 100644
--- a/lldb/source/Breakpoint/BreakpointResolverFileLine.cpp
+++ b/lldb/source/Breakpoint/BreakpointResolverFileLine.cpp
@@ -111,7 +111,7 @@ BreakpointResolverFileLine::GetDepth()
void
BreakpointResolverFileLine::GetDescription (Stream *s)
{
- s->Printf ("File and line breakpoint - file: \"%s\" line: %u", m_file_spec.GetFilename().AsCString(), m_line_number);
+ s->Printf ("file ='%s', line = %u", m_file_spec.GetFilename().AsCString(), m_line_number);
}
void
diff --git a/lldb/source/Breakpoint/BreakpointResolverName.cpp b/lldb/source/Breakpoint/BreakpointResolverName.cpp
index b04bb8aef48..f25910de565 100644
--- a/lldb/source/Breakpoint/BreakpointResolverName.cpp
+++ b/lldb/source/Breakpoint/BreakpointResolverName.cpp
@@ -25,11 +25,13 @@ BreakpointResolverName::BreakpointResolverName
(
Breakpoint *bkpt,
const char *func_name,
+ uint32_t func_name_type_mask,
Breakpoint::MatchType type
) :
BreakpointResolver (bkpt),
m_func_name (func_name),
- m_class_name (NULL),
+ m_func_name_type_mask (func_name_type_mask),
+ m_class_name (),
m_regex (),
m_match_type (type)
{
@@ -94,45 +96,47 @@ BreakpointResolverName::SearchCallback
{
SymbolContextList func_list;
SymbolContextList sym_list;
-
+
bool skip_prologue = true;
uint32_t i;
bool new_location;
SymbolContext sc;
Address break_addr;
assert (m_breakpoint != NULL);
-
+
Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS);
-
+
if (m_class_name)
{
if (log)
log->Warning ("Class/method function specification not supported yet.\n");
return Searcher::eCallbackReturnStop;
}
-
+
switch (m_match_type)
{
- case Breakpoint::Exact:
- if (context.module_sp)
- {
- context.module_sp->FindSymbolsWithNameAndType (m_func_name, eSymbolTypeCode, sym_list);
- context.module_sp->FindFunctions (m_func_name, false, func_list);
- }
- break;
- case Breakpoint::Regexp:
- if (context.module_sp)
- {
- context.module_sp->FindSymbolsMatchingRegExAndType (m_regex, eSymbolTypeCode, sym_list);
- context.module_sp->FindFunctions (m_regex, true, func_list);
- }
- break;
- case Breakpoint::Glob:
- if (log)
- log->Warning ("glob is not supported yet.");
- break;
+ case Breakpoint::Exact:
+ if (context.module_sp)
+ {
+ if (m_func_name_type_mask & (eFunctionNameTypeBase | eFunctionNameTypeFull))
+ context.module_sp->FindSymbolsWithNameAndType (m_func_name, eSymbolTypeCode, sym_list);
+ context.module_sp->FindFunctions (m_func_name, m_func_name_type_mask, false, func_list);
+ }
+ break;
+ case Breakpoint::Regexp:
+ if (context.module_sp)
+ {
+ if (m_func_name_type_mask & (eFunctionNameTypeBase | eFunctionNameTypeFull))
+ context.module_sp->FindSymbolsMatchingRegExAndType (m_regex, eSymbolTypeCode, sym_list);
+ context.module_sp->FindFunctions (m_regex, true, func_list);
+ }
+ break;
+ case Breakpoint::Glob:
+ if (log)
+ log->Warning ("glob is not supported yet.");
+ break;
}
-
+
// Remove any duplicates between the funcion list and the symbol list
if (func_list.GetSize())
{
@@ -140,7 +144,7 @@ BreakpointResolverName::SearchCallback
{
if (func_list.GetContextAtIndex(i, sc) == false)
continue;
-
+
if (sc.function == NULL)
continue;
uint32_t j = 0;
@@ -158,11 +162,11 @@ BreakpointResolverName::SearchCallback
}
}
}
-
+
j++;
}
}
-
+
for (i = 0; i < func_list.GetSize(); i++)
{
if (func_list.GetContextAtIndex(i, sc))
@@ -176,7 +180,7 @@ BreakpointResolverName::SearchCallback
if (prologue_byte_size)
break_addr.SetOffset(break_addr.GetOffset() + prologue_byte_size);
}
-
+
if (filter.AddressPasses(break_addr))
{
BreakpointLocationSP bp_loc_sp (m_breakpoint->AddLocation(break_addr, &new_location));
@@ -194,7 +198,7 @@ BreakpointResolverName::SearchCallback
}
}
}
-
+
for (i = 0; i < sym_list.GetSize(); i++)
{
if (sym_list.GetContextAtIndex(i, sc))
@@ -202,14 +206,14 @@ BreakpointResolverName::SearchCallback
if (sc.symbol && sc.symbol->GetAddressRangePtr())
{
break_addr = sc.symbol->GetAddressRangePtr()->GetBaseAddress();
-
+
if (skip_prologue)
{
const uint32_t prologue_byte_size = sc.symbol->GetPrologueByteSize();
if (prologue_byte_size)
break_addr.SetOffset(break_addr.GetOffset() + prologue_byte_size);
}
-
+
if (filter.AddressPasses(break_addr))
{
BreakpointLocationSP bp_loc_sp (m_breakpoint->AddLocation(break_addr, &new_location));
@@ -236,12 +240,10 @@ BreakpointResolverName::GetDepth()
void
BreakpointResolverName::GetDescription (Stream *s)
{
- s->PutCString("Breakpoint by name: ");
-
if (m_match_type == Breakpoint::Regexp)
- s->Printf("'%s' (regular expression)", m_regex.GetText());
+ s->Printf("regex = '%s'", m_regex.GetText());
else
- s->Printf("'%s'", m_func_name.AsCString());
+ s->Printf("name = '%s'", m_func_name.AsCString());
}
void
diff --git a/lldb/source/Commands/CommandObjectBreakpoint.cpp b/lldb/source/Commands/CommandObjectBreakpoint.cpp
index 01d29fbd81b..830fbec6fbc 100644
--- a/lldb/source/Commands/CommandObjectBreakpoint.cpp
+++ b/lldb/source/Commands/CommandObjectBreakpoint.cpp
@@ -52,6 +52,7 @@ CommandObjectBreakpointSet::CommandOptions::CommandOptions() :
m_column (0),
m_ignore_inlines (false),
m_func_name (),
+ m_func_name_type_mask (0),
m_func_regexp (),
m_modules (),
m_load_addr(),
@@ -70,31 +71,28 @@ CommandObjectBreakpointSet::CommandOptions::~CommandOptions ()
lldb::OptionDefinition
CommandObjectBreakpointSet::CommandOptions::g_option_table[] =
{
- { LLDB_OPT_SET_ALL, false, "shlib", 's', required_argument, NULL, CommandCompletions::eModuleCompletion, "<shlib-name>",
+ { LLDB_OPT_SET_ALL, false, "shlib", 's', required_argument, NULL, CommandCompletions::eModuleCompletion, "<shlib-name>",
"Set the breakpoint only in this shared library (can use this option multiple times for multiple shlibs)."},
- { LLDB_OPT_SET_ALL, false, "ignore_inlines", 'i', no_argument, NULL, 0, NULL,
- "Ignore inlined subroutines when setting the breakppoint." },
-
- { LLDB_OPT_SET_ALL, false, "ignore_count", 'k', required_argument, NULL, 0, NULL,
+ { LLDB_OPT_SET_ALL, false, "ignore_count", 'k', required_argument, NULL, 0, "<n>",
"Set the number of times this breakpoint is sKipped before stopping." },
- { LLDB_OPT_SET_ALL, false, "thread_index", 'x', required_argument, NULL, NULL, "<thread_index>",
+ { LLDB_OPT_SET_ALL, false, "thread_index", 'x', required_argument, NULL, NULL, "<thread_index>",
"The breakpoint stops only for the thread whose indeX matches this argument."},
- { LLDB_OPT_SET_ALL, false, "thread_id", 't', required_argument, NULL, NULL, "<thread_id>",
+ { LLDB_OPT_SET_ALL, false, "thread_id", 't', required_argument, NULL, NULL, "<thread_id>",
"The breakpoint stops only for the thread whose TID matches this argument."},
- { LLDB_OPT_SET_ALL, false, "thread_name", 'T', required_argument, NULL, NULL, "<thread_name>",
+ { LLDB_OPT_SET_ALL, false, "thread_name", 'T', required_argument, NULL, NULL, "<thread_name>",
"The breakpoint stops only for the thread whose thread name matches this argument."},
- { LLDB_OPT_SET_ALL, false, "queue_name", 'q', required_argument, NULL, NULL, "<queue_name>",
+ { LLDB_OPT_SET_ALL, false, "queue_name", 'q', required_argument, NULL, NULL, "<queue_name>",
"The breakpoint stops only for threads in the queue whose name is given by this argument."},
- { LLDB_OPT_SET_1, false, "file", 'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, "<filename>",
+ { LLDB_OPT_SET_1, false, "file", 'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, "<filename>",
"Set the breakpoint by source location in this particular file."},
- { LLDB_OPT_SET_1, true, "line", 'l', required_argument, NULL, 0, "<linenum>",
+ { LLDB_OPT_SET_1, true, "line", 'l', required_argument, NULL, 0, "<linenum>",
"Set the breakpoint by source location at this particular line."},
// Comment out this option for the moment, as we don't actually use it, but will in the future.
@@ -102,12 +100,24 @@ CommandObjectBreakpointSet::CommandOptions::g_option_table[] =
// { 0, false, "column", 'c', required_argument, NULL, "<column>",
// "Set the breakpoint by source location at this particular column."},
- { LLDB_OPT_SET_2, true, "address", 'a', required_argument, NULL, 0, "<address>",
+ { LLDB_OPT_SET_2, true, "address", 'a', required_argument, NULL, 0, "<address>",
"Set the breakpoint by address, at the specified address."},
- { LLDB_OPT_SET_3, true, "name", 'n', required_argument, NULL, CommandCompletions::eSymbolCompletion, "<function-name>",
+ { LLDB_OPT_SET_3, true, "name", 'n', required_argument, NULL, CommandCompletions::eSymbolCompletion, "<name>",
"Set the breakpoint by function name." },
+ { LLDB_OPT_SET_3, false, "basename", 'b', no_argument, NULL, 0, NULL,
+ "Used in conjuction with --name <name> to search function basenames." },
+
+ { LLDB_OPT_SET_3, false, "fullname", 'F', no_argument, NULL, 0, NULL,
+ "Used in conjuction with --name <name> to search fully qualified function names. For C++ this means namespaces and all arguemnts, and for Objective C this means a full function prototype with class and selector." },
+
+ { LLDB_OPT_SET_3, false, "selector", 'S', no_argument, NULL, 0, NULL,
+ "Used in conjuction with --name <name> to search objective C selector names." },
+
+ { LLDB_OPT_SET_3, false, "method", 'm', no_argument, NULL, 0, NULL,
+ "Used in conjuction with --name <name> to search objective C selector C++ method names." },
+
{ LLDB_OPT_SET_4, true, "func_regex", 'r', required_argument, NULL, 0, "<regular-expression>",
"Set the breakpoint by function name, evaluating a regular-expression to find the function name(s)." },
@@ -140,21 +150,39 @@ CommandObjectBreakpointSet::CommandOptions::SetOptionValue (int option_idx, cons
case 'c':
m_column = Args::StringToUInt32 (option_arg, 0);
break;
+
case 'f':
m_filename = option_arg;
break;
- case 'i':
- m_ignore_inlines = true;
- break;
+
case 'l':
m_line_num = Args::StringToUInt32 (option_arg, 0);
break;
+
case 'n':
m_func_name = option_arg;
break;
+
+ case 'b':
+ m_func_name_type_mask |= eFunctionNameTypeBase;
+ break;
+
+ case 'F':
+ m_func_name_type_mask |= eFunctionNameTypeFull;
+ break;
+
+ case 'S':
+ m_func_name_type_mask |= eFunctionNameTypeSelector;
+ break;
+
+ case 'm':
+ m_func_name_type_mask |= eFunctionNameTypeMethod;
+ break;
+
case 'r':
m_func_regexp = option_arg;
break;
+
case 's':
{
m_modules.push_back (std::string (option_arg));
@@ -204,8 +232,8 @@ CommandObjectBreakpointSet::CommandOptions::ResetOptionValues ()
m_filename.clear();
m_line_num = 0;
m_column = 0;
- m_ignore_inlines = false;
m_func_name.clear();
+ m_func_name_type_mask = 0;
m_func_regexp.clear();
m_load_addr = LLDB_INVALID_ADDRESS;
m_modules.clear();
@@ -357,32 +385,50 @@ CommandObjectBreakpointSet::Execute
case eSetTypeAddress: // Breakpoint by address
bp = target->CreateBreakpoint (m_options.m_load_addr, false).get();
break;
+
case eSetTypeFunctionName: // Breakpoint by function name
- if (use_module)
{
- for (int i = 0; i < num_modules; ++i)
+ uint32_t name_type_mask = m_options.m_func_name_type_mask;
+
+ if (name_type_mask == 0)
{
- module.SetFile(m_options.m_modules[i].c_str());
- bp = target->CreateBreakpoint (&module, m_options.m_func_name.c_str()).get();
- if (bp)
- {
- StreamString &output_stream = result.GetOutputStream();
- output_stream.Printf ("Breakpoint created: ");
- bp->GetDescription(&output_stream, lldb::eDescriptionLevelBrief);
- output_stream.EOL();
- result.SetStatus (eReturnStatusSuccessFinishResult);
- }
+
+ if (m_options.m_func_name.find('(') != std::string::npos ||
+ m_options.m_func_name.find("-[") == 0 ||
+ m_options.m_func_name.find("+[") == 0)
+ name_type_mask |= eFunctionNameTypeFull;
else
+ name_type_mask |= eFunctionNameTypeBase;
+ }
+
+
+ if (use_module)
+ {
+ for (int i = 0; i < num_modules; ++i)
{
- result.AppendErrorWithFormat("Breakpoint creation failed: No breakpoint created in module '%s'.\n",
- m_options.m_modules[i].c_str());
- result.SetStatus (eReturnStatusFailed);
+ module.SetFile(m_options.m_modules[i].c_str());
+ bp = target->CreateBreakpoint (&module, m_options.m_func_name.c_str(), name_type_mask, Breakpoint::Exact).get();
+ if (bp)
+ {
+ StreamString &output_stream = result.GetOutputStream();
+ output_stream.Printf ("Breakpoint created: ");
+ bp->GetDescription(&output_stream, lldb::eDescriptionLevelBrief);
+ output_stream.EOL();
+ result.SetStatus (eReturnStatusSuccessFinishResult);
+ }
+ else
+ {
+ result.AppendErrorWithFormat("Breakpoint creation failed: No breakpoint created in module '%s'.\n",
+ m_options.m_modules[i].c_str());
+ result.SetStatus (eReturnStatusFailed);
+ }
}
}
+ else
+ bp = target->CreateBreakpoint (NULL, m_options.m_func_name.c_str(), name_type_mask, Breakpoint::Exact).get();
}
- else
- bp = target->CreateBreakpoint (NULL, m_options.m_func_name.c_str()).get();
break;
+
case eSetTypeFunctionRegexp: // Breakpoint by regular expression function name
{
RegularExpression regexp(m_options.m_func_regexp.c_str());
@@ -412,6 +458,7 @@ CommandObjectBreakpointSet::Execute
bp = target->CreateBreakpoint (NULL, regexp).get();
}
break;
+
default:
break;
}
diff --git a/lldb/source/Commands/CommandObjectBreakpoint.h b/lldb/source/Commands/CommandObjectBreakpoint.h
index 92bea698847..20f2c3b994a 100644
--- a/lldb/source/Commands/CommandObjectBreakpoint.h
+++ b/lldb/source/Commands/CommandObjectBreakpoint.h
@@ -98,10 +98,11 @@ public:
// Instance variables to hold the values for command options.
std::string m_filename;
- unsigned int m_line_num;
- unsigned int m_column;
+ uint32_t m_line_num;
+ uint32_t m_column;
bool m_ignore_inlines;
std::string m_func_name;
+ uint32_t m_func_name_type_mask;
std::string m_func_regexp;
lldb::addr_t m_load_addr;
STLStringArray m_modules;
diff --git a/lldb/source/Commands/CommandObjectCall.cpp b/lldb/source/Commands/CommandObjectCall.cpp
index a2cbc05ce13..12281b361cb 100644
--- a/lldb/source/Commands/CommandObjectCall.cpp
+++ b/lldb/source/Commands/CommandObjectCall.cpp
@@ -295,7 +295,7 @@ CommandObjectCall::Execute
lldb::OptionDefinition
CommandObjectCall::CommandOptions::g_option_table[] =
{
-{ LLDB_OPT_SET_1, true, "language", 'l', required_argument, NULL, 0, "[c|c++|objc|objc++]", "Sets the language to use when parsing the expression."},
+{ LLDB_OPT_SET_1, false, "language", 'l', required_argument, NULL, 0, "[c|c++|objc|objc++]", "Sets the language to use when parsing the expression."},
{ LLDB_OPT_SET_1, false, "format", 'f', required_argument, NULL, 0, "[ [bool|b] | [bin] | [char|c] | [oct|o] | [dec|i|d|u] | [hex|x] | [float|f] | [cstr|s] ]", "Specify the format that the expression output should use."},
{ LLDB_OPT_SET_1, false, "debug", 'g', no_argument, NULL, 0, NULL, "Enable verbose debug logging of the expression parsing and evaluation."},
{ LLDB_OPT_SET_1, false, "noexecute", 'n', no_argument, NULL, 0, "no execute", "Only JIT and copy the wrapper & arguments, but don't execute."},
diff --git a/lldb/source/Commands/CommandObjectDisassemble.cpp b/lldb/source/Commands/CommandObjectDisassemble.cpp
index c2abeee702c..c5fbbea0b41 100644
--- a/lldb/source/Commands/CommandObjectDisassemble.cpp
+++ b/lldb/source/Commands/CommandObjectDisassemble.cpp
@@ -389,7 +389,9 @@ CommandObjectDisassemble::Execute
{
SymbolContextList sc_list;
- if (target->GetImages().FindFunctions(name, sc_list))
+ if (target->GetImages().FindFunctions(name,
+ eFunctionNameTypeBase | eFunctionNameTypeFull | eFunctionNameTypeMethod | eFunctionNameTypeSelector,
+ sc_list))
{
Disassemble (interpreter, result, disassembler, sc_list);
}
diff --git a/lldb/source/Commands/CommandObjectExpression.cpp b/lldb/source/Commands/CommandObjectExpression.cpp
index 7ddd3a176be..e98303c739e 100644
--- a/lldb/source/Commands/CommandObjectExpression.cpp
+++ b/lldb/source/Commands/CommandObjectExpression.cpp
@@ -456,7 +456,7 @@ CommandObjectExpression::ExecuteRawCommandString
lldb::OptionDefinition
CommandObjectExpression::CommandOptions::g_option_table[] =
{
-{ LLDB_OPT_SET_ALL, true, "language", 'l', required_argument, NULL, 0, "[c|c++|objc|objc++]", "Sets the language to use when parsing the expression."},
+{ LLDB_OPT_SET_ALL, false, "language", 'l', required_argument, NULL, 0, "[c|c++|objc|objc++]", "Sets the language to use when parsing the expression."},
{ LLDB_OPT_SET_ALL, false, "format", 'f', required_argument, NULL, 0, "[ [bool|b] | [bin] | [char|c] | [oct|o] | [dec|i|d|u] | [hex|x] | [float|f] | [cstr|s] ]", "Specify the format that the expression output should use."},
{ LLDB_OPT_SET_ALL, false, "debug", 'g', no_argument, NULL, 0, NULL, "Enable verbose debug logging of the expression parsing and evaluation."},
{ LLDB_OPT_SET_ALL, false, "use-ir", 'i', no_argument, NULL, 0, NULL, "[Temporary] Instructs the expression evaluator to use IR instead of ASTs."},
diff --git a/lldb/source/Commands/CommandObjectImage.cpp b/lldb/source/Commands/CommandObjectImage.cpp
index 38a04ecf5f0..cb717c41bbd 100644
--- a/lldb/source/Commands/CommandObjectImage.cpp
+++ b/lldb/source/Commands/CommandObjectImage.cpp
@@ -227,9 +227,12 @@ LookupAddressInModule (CommandInterpreter &interpreter, Stream &strm, Module *mo
strm.Printf("0x%llx: ", addr);
ExecutionContextScope *exe_scope = interpreter.GetDebugger().GetExecutionContext().GetBestExecutionContextScope();
- if (so_addr.Dump (&strm, exe_scope, Address::DumpStyleSectionNameOffset))
- strm.PutCString(": ");
+ strm.IndentMore();
+ strm.Indent (" Address: ");
+ so_addr.Dump (&strm, exe_scope, Address::DumpStyleSectionNameOffset);
+ strm.EOL();
so_addr.Dump (&strm, exe_scope, Address::DumpStyleResolvedDescription);
+ strm.IndentLess();
return true;
}
@@ -347,7 +350,7 @@ LookupFunctionInModule (CommandInterpreter &interpreter, Stream &strm, Module *m
else
{
ConstString function_name(name);
- num_matches = symbol_vendor->FindFunctions(function_name, true, sc_list);
+ num_matches = symbol_vendor->FindFunctions(function_name, eFunctionNameTypeBase | eFunctionNameTypeFull | eFunctionNameTypeMethod | eFunctionNameTypeSelector, true, sc_list);
}
if (num_matches)
diff --git a/lldb/source/Commands/CommandObjectThread.cpp b/lldb/source/Commands/CommandObjectThread.cpp
index bf4843da67f..0fd53fe9c78 100644
--- a/lldb/source/Commands/CommandObjectThread.cpp
+++ b/lldb/source/Commands/CommandObjectThread.cpp
@@ -619,8 +619,8 @@ g_duo_running_mode[] =
lldb::OptionDefinition
CommandObjectThreadStepWithTypeAndScope::CommandOptions::g_option_table[] =
{
-{ LLDB_OPT_SET_1, true, "avoid_no_debug", 'a', required_argument, NULL, 0, "<avoid_no_debug>", "Should step-in step over functions with no debug information"},
-{ LLDB_OPT_SET_1, true, "run_mode", 'm', required_argument, g_tri_running_mode, 0, "<run_mode>", "Determine how to run other threads while stepping this one"},
+{ LLDB_OPT_SET_1, false, "avoid_no_debug", 'a', required_argument, NULL, 0, "<avoid_no_debug>", "Should step-in step over functions with no debug information"},
+{ LLDB_OPT_SET_1, false, "run_mode", 'm', required_argument, g_tri_running_mode, 0, "<run_mode>", "Determine how to run other threads while stepping this one"},
{ 0, false, NULL, 0, 0, NULL, 0, NULL, NULL }
};
@@ -1060,9 +1060,9 @@ protected:
lldb::OptionDefinition
CommandObjectThreadUntil::CommandOptions::g_option_table[] =
{
-{ LLDB_OPT_SET_1, true, "frame", 'f', required_argument, NULL, 0, "<frame>", "Frame index for until operation - defaults to 0"},
-{ LLDB_OPT_SET_1, true, "thread", 't', required_argument, NULL, 0, "<thread>", "Thread index for the thread for until operation"},
-{ LLDB_OPT_SET_1, true, "run_mode", 'm', required_argument, g_duo_running_mode, 0, "<run_mode>", "Determine how to run other threads while stepping this one"},
+{ LLDB_OPT_SET_1, false, "frame", 'f', required_argument, NULL, 0, "<frame>", "Frame index for until operation - defaults to 0"},
+{ LLDB_OPT_SET_1, false, "thread", 't', required_argument, NULL, 0, "<thread>", "Thread index for the thread for until operation"},
+{ LLDB_OPT_SET_1, false, "run_mode",'m', required_argument, g_duo_running_mode, 0, "<run_mode>","Determine how to run other threads while stepping this one"},
{ 0, false, NULL, 0, 0, NULL, 0, NULL, NULL }
};
diff --git a/lldb/source/Core/Address.cpp b/lldb/source/Core/Address.cpp
index 034c8d83acc..f7e75001701 100644
--- a/lldb/source/Core/Address.cpp
+++ b/lldb/source/Core/Address.cpp
@@ -629,7 +629,10 @@ Address::Dump (Stream *s, ExecutionContextScope *exe_scope, DumpStyle style, Dum
{
// We have a function or a symbol from the same
// sections as this address.
+ s->Indent(" Summary: ");
sc.DumpStopContext(s, process, *this, false);
+ s->EOL();
+ sc.GetDescription(s, eDescriptionLevelBrief, process);
}
else
{
diff --git a/lldb/source/Core/AddressResolverName.cpp b/lldb/source/Core/AddressResolverName.cpp
index 9e154c6e703..490fc464348 100644
--- a/lldb/source/Core/AddressResolverName.cpp
+++ b/lldb/source/Core/AddressResolverName.cpp
@@ -107,15 +107,24 @@ AddressResolverName::SearchCallback
case AddressResolver::Exact:
if (context.module_sp)
{
- context.module_sp->FindSymbolsWithNameAndType (m_func_name, eSymbolTypeCode, sym_list);
- context.module_sp->FindFunctions (m_func_name, false, func_list);
+ context.module_sp->FindSymbolsWithNameAndType (m_func_name,
+ eSymbolTypeCode,
+ sym_list);
+ context.module_sp->FindFunctions (m_func_name,
+ eFunctionNameTypeBase | eFunctionNameTypeFull | eFunctionNameTypeMethod | eFunctionNameTypeSelector,
+ false,
+ func_list);
}
break;
case AddressResolver::Regexp:
if (context.module_sp)
{
- context.module_sp->FindSymbolsMatchingRegExAndType (m_regex, eSymbolTypeCode, sym_list);
- context.module_sp->FindFunctions (m_regex, true, func_list);
+ context.module_sp->FindSymbolsMatchingRegExAndType (m_regex,
+ eSymbolTypeCode,
+ sym_list);
+ context.module_sp->FindFunctions (m_regex,
+ true,
+ func_list);
}
break;
case AddressResolver::Glob:
diff --git a/lldb/source/Core/Module.cpp b/lldb/source/Core/Module.cpp
index c8e7d2f2c42..3d0b9820117 100644
--- a/lldb/source/Core/Module.cpp
+++ b/lldb/source/Core/Module.cpp
@@ -286,11 +286,11 @@ Module::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_
}
uint32_t
-Module::FindFunctions(const ConstString &name, bool append, SymbolContextList& sc_list)
+Module::FindFunctions(const ConstString &name, uint32_t name_type_mask, bool append, SymbolContextList& sc_list)
{
SymbolVendor *symbols = GetSymbolVendor ();
if (symbols)
- return symbols->FindFunctions(name, append, sc_list);
+ return symbols->FindFunctions(name, name_type_mask, append, sc_list);
return 0;
}
diff --git a/lldb/source/Core/ModuleList.cpp b/lldb/source/Core/ModuleList.cpp
index ae6e27b1dd2..c928508b340 100644
--- a/lldb/source/Core/ModuleList.cpp
+++ b/lldb/source/Core/ModuleList.cpp
@@ -126,14 +126,14 @@ ModuleList::GetModuleAtIndex(uint32_t idx)
}
size_t
-ModuleList::FindFunctions (const ConstString &name, SymbolContextList &sc_list)
+ModuleList::FindFunctions (const ConstString &name, uint32_t name_type_mask, SymbolContextList &sc_list)
{
sc_list.Clear();
Mutex::Locker locker(m_modules_mutex);
collection::const_iterator pos, end = m_modules.end();
for (pos = m_modules.begin(); pos != end; ++pos)
{
- (*pos)->FindFunctions (name, true, sc_list);
+ (*pos)->FindFunctions (name, name_type_mask, true, sc_list);
}
return sc_list.GetSize();
}
diff --git a/lldb/source/Core/SearchFilter.cpp b/lldb/source/Core/SearchFilter.cpp
index 4c54a912801..b08f4d80d5e 100644
--- a/lldb/source/Core/SearchFilter.cpp
+++ b/lldb/source/Core/SearchFilter.cpp
@@ -113,7 +113,6 @@ SearchFilter::CompUnitPasses (CompileUnit &compUnit)
void
SearchFilter::GetDescription (Stream *s)
{
- s->PutCString("No Filter");
}
void
@@ -415,7 +414,7 @@ SearchFilterByModule::Search (Searcher &searcher)
void
SearchFilterByModule::GetDescription (Stream *s)
{
- s->PutCString("In module ");
+ s->PutCString(", module = ");
if (s->GetVerbose())
{
char buffer[2048];
diff --git a/lldb/source/Core/VMRange.cpp b/lldb/source/Core/VMRange.cpp
index 29a699d6569..44b9975a810 100644
--- a/lldb/source/Core/VMRange.cpp
+++ b/lldb/source/Core/VMRange.cpp
@@ -42,9 +42,9 @@ VMRange::ContainsRange(const VMRange::collection& coll, const VMRange& range)
void
-VMRange::Dump(Stream *s, lldb::addr_t offset) const
+VMRange::Dump(Stream *s, lldb::addr_t offset, uint32_t addr_width) const
{
- s->AddressRange(offset + GetBaseAddress(), offset + GetEndAddress(), sizeof (addr_t));
+ s->AddressRange(offset + GetBaseAddress(), offset + GetEndAddress(), addr_width);
}
bool
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
index e7f92c6eff2..54cbf42f0d6 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
@@ -14,6 +14,7 @@
#include "DWARFDebugAbbrev.h"
#include "DWARFDebugAranges.h"
+#include "DWARFDebugInfo.h"
#include "DWARFDIECollection.h"
#include "DWARFFormValue.h"
#include "LogChannelDWARF.h"
@@ -549,13 +550,14 @@ DWARFCompileUnit::AddGlobal (const DWARFDebugInfoEntry* die)
void
DWARFCompileUnit::Index
(
- lldb_private::UniqueCStringMap<dw_offset_t>& name_to_function_die,
- lldb_private::UniqueCStringMap<dw_offset_t>& name_to_inlined_die,
- lldb_private::UniqueCStringMap<dw_offset_t>& name_to_global_die,
- lldb_private::UniqueCStringMap<dw_offset_t>& name_to_type_die
+ lldb_private::UniqueCStringMap<dw_offset_t>& base_name_to_function_die,
+ lldb_private::UniqueCStringMap<dw_offset_t>& full_name_to_function_die,
+ lldb_private::UniqueCStringMap<dw_offset_t>& method_name_to_function_die,
+ lldb_private::UniqueCStringMap<dw_offset_t>& selector_name_to_function_die,
+ lldb_private::UniqueCStringMap<dw_offset_t>& name_to_type_die,
+ lldb_private::UniqueCStringMap<dw_offset_t>& name_to_global_die
)
{
-
const DataExtractor* debug_str = &m_dwarf2Data->get_debug_str_data();
DWARFDebugInfoEntry::const_iterator pos;
@@ -597,6 +599,7 @@ DWARFCompileUnit::Index
bool has_address = false;
bool has_location = false;
bool is_global_or_static_variable = false;
+ dw_offset_t specification_die_offset = DW_INVALID_OFFSET;
const size_t num_attributes = die.GetAttributes(m_dwarf2Data, this, attributes);
if (num_attributes > 0)
{
@@ -685,6 +688,11 @@ DWARFCompileUnit::Index
}
}
break;
+
+ case DW_AT_specification:
+ if (attributes.ExtractFormValueAtIndex(m_dwarf2Data, i, form_value))
+ specification_die_offset = form_value.Reference(this);
+ break;
}
}
}
@@ -694,7 +702,7 @@ DWARFCompileUnit::Index
case DW_TAG_subprogram:
if (has_address)
{
- if (name && name[0])
+ if (name)
{
if ((name[0] == '-' || name[0] == '+') && name[1] == '[')
{
@@ -716,24 +724,58 @@ DWARFCompileUnit::Index
// accelerator tables
size_t method_name_len = name_len - (method_name - name) - 1;
ConstString method_const_str (method_name, method_name_len);
- name_to_function_die.Append(method_const_str.AsCString(), die.GetOffset());
+ selector_name_to_function_die.Append(method_const_str.AsCString(), die.GetOffset());
+ }
+ }
+ }
+ // If we have a mangled name, then the DW_AT_name attribute
+ // is usually the method name without the class or any parameters
+ const DWARFDebugInfoEntry *parent = die.GetParent();
+ bool is_method = false;
+ if (parent)
+ {
+ dw_tag_t tag = parent->Tag();
+ if (tag == DW_TAG_class_type || tag == DW_TAG_structure_type)
+ {
+ is_method = true;
+ }
+ else
+ {
+ if (mangled && specification_die_offset != DW_INVALID_OFFSET)
+ {
+ const DWARFDebugInfoEntry *specification_die = m_dwarf2Data->DebugInfo()->GetDIEPtr (specification_die_offset, NULL);
+ if (specification_die)
+ {
+ parent = specification_die->GetParent();
+ if (parent)
+ {
+ tag = parent->Tag();
+
+ if (tag == DW_TAG_class_type || tag == DW_TAG_structure_type)
+ is_method = true;
+ }
+ }
}
}
}
- name_to_function_die.Append(ConstString(name).AsCString(), die.GetOffset());
+
+ if (is_method)
+ method_name_to_function_die.Append(ConstString(name).AsCString(), die.GetOffset());
+ else
+ base_name_to_function_die.Append(ConstString(name).AsCString(), die.GetOffset());
}
- if (mangled && mangled[0])
- name_to_function_die.Append(ConstString(mangled).AsCString(), die.GetOffset());
+ if (mangled)
+ full_name_to_function_die.Append(ConstString(mangled).AsCString(), die.GetOffset());
}
break;
case DW_TAG_inlined_subroutine:
if (has_address)
{
- if (name && name[0])
- name_to_inlined_die.Append(ConstString(name).AsCString(), die.GetOffset());
- if (mangled && mangled[0])
- name_to_inlined_die.Append(ConstString(mangled).AsCString(), die.GetOffset());
+ if (name)
+ base_name_to_function_die.Append(ConstString(name).AsCString(), die.GetOffset());
+ if (mangled)
+ full_name_to_function_die.Append(ConstString(mangled).AsCString(), die.GetOffset());
}
break;
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h
index 44bbbfe5ba4..d269537ce69 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h
@@ -142,10 +142,13 @@ public:
}
void
- Index (lldb_private::UniqueCStringMap<dw_offset_t>& name_to_function_die,
- lldb_private::UniqueCStringMap<dw_offset_t>& name_to_inlined_die,
- lldb_private::UniqueCStringMap<dw_offset_t>& name_to_global_die,
- lldb_private::UniqueCStringMap<dw_offset_t>& name_to_type_die);
+ Index (lldb_private::UniqueCStringMap<dw_offset_t>& base_name_to_function_die,
+ lldb_private::UniqueCStringMap<dw_offset_t>& full_name_to_function_die,
+ lldb_private::UniqueCStringMap<dw_offset_t>& method_name_to_function_die,
+ lldb_private::UniqueCStringMap<dw_offset_t>& selector_name_to_function_die,
+ lldb_private::UniqueCStringMap<dw_offset_t>& name_to_type_die,
+ lldb_private::UniqueCStringMap<dw_offset_t>& name_to_global_die);
+
protected:
SymbolFileDWARF* m_dwarf2Data;
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index 27b0aa237d4..67e4dfcc75e 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -229,8 +229,10 @@ SymbolFileDWARF::SymbolFileDWARF(ObjectFile* ofile) :
m_aranges(),
m_info(),
m_line(),
- m_name_to_function_die(),
- m_name_to_inlined_die(),
+ m_base_name_to_function_die(),
+ m_full_name_to_function_die(),
+ m_method_name_to_function_die(),
+ m_selector_name_to_function_die(),
m_name_to_global_die(),
m_name_to_type_die(),
m_indexed(false),
@@ -1778,8 +1780,10 @@ SymbolFileDWARF::Index ()
bool clear_dies = cu->ExtractDIEsIfNeeded (false) > 1;
- cu->Index (m_name_to_function_die,
- m_name_to_inlined_die,
+ cu->Index (m_base_name_to_function_die,
+ m_full_name_to_function_die,
+ m_method_name_to_function_die,
+ m_selector_name_to_function_die,
m_name_to_global_die,
m_name_to_type_die);
@@ -1789,8 +1793,10 @@ SymbolFileDWARF::Index ()
cu->ClearDIEs (true);
}
- m_name_to_function_die.Sort();
- m_name_to_inlined_die.Sort();
+ m_base_name_to_function_die.Sort();
+ m_full_name_to_function_die.Sort();
+ m_method_name_to_function_die.Sort();
+ m_selector_name_to_function_die.Sort();
m_name_to_global_die.Sort();
m_name_to_type_die.Sort();
}
@@ -1893,33 +1899,20 @@ SymbolFileDWARF::FindGlobalVariables(const RegularExpression& regex, bool append
}
-uint32_t
-SymbolFileDWARF::FindFunctions(const ConstString &name, bool append, SymbolContextList& sc_list)
+void
+SymbolFileDWARF::FindFunctions
+(
+ const ConstString &name,
+ UniqueCStringMap<dw_offset_t> &name_to_die,
+ SymbolContextList& sc_list
+)
{
- Timer scoped_timer (__PRETTY_FUNCTION__,
- "SymbolFileDWARF::FindFunctions (name = '%s')",
- name.AsCString());
-
- std::vector<dw_offset_t> die_offsets;
-
- // If we aren't appending the results to this list, then clear the list
- if (!append)
- sc_list.Clear();
-
- // Remember how many sc_list are in the list before we search in case
- // we are appending the results to a variable list.
- uint32_t original_size = sc_list.GetSize();
-
- // Index the DWARF if we haven't already
- if (!m_indexed)
- Index ();
-
const UniqueCStringMap<dw_offset_t>::Entry *entry;
SymbolContext sc;
- for (entry = m_name_to_function_die.FindFirstValueForName (name.AsCString());
+ for (entry = name_to_die.FindFirstValueForName (name.AsCString());
entry != NULL;
- entry = m_name_to_function_die.FindNextValueForName (name.AsCString(), entry))
+ entry = name_to_die.FindNextValueForName (name.AsCString(), entry))
{
DWARFCompileUnitSP cu_sp;
const DWARFDebugInfoEntry* die = DebugInfo()->GetDIEPtr (entry->value, &cu_sp);
@@ -1943,6 +1936,47 @@ SymbolFileDWARF::FindFunctions(const ConstString &name, bool append, SymbolConte
}
}
+}
+
+uint32_t
+SymbolFileDWARF::FindFunctions
+(
+ const ConstString &name,
+ uint32_t name_type_mask,
+ bool append,
+ SymbolContextList& sc_list
+)
+{
+ Timer scoped_timer (__PRETTY_FUNCTION__,
+ "SymbolFileDWARF::FindFunctions (name = '%s')",
+ name.AsCString());
+
+ std::vector<dw_offset_t> die_offsets;
+
+ // If we aren't appending the results to this list, then clear the list
+ if (!append)
+ sc_list.Clear();
+
+ // Remember how many sc_list are in the list before we search in case
+ // we are appending the results to a variable list.
+ uint32_t original_size = sc_list.GetSize();
+
+ // Index the DWARF if we haven't already
+ if (!m_indexed)
+ Index ();
+
+ if (name_type_mask & eFunctionNameTypeBase)
+ FindFunctions (name, m_base_name_to_function_die, sc_list);
+
+ if (name_type_mask & eFunctionNameTypeFull)
+ FindFunctions (name, m_full_name_to_function_die, sc_list);
+
+ if (name_type_mask & eFunctionNameTypeMethod)
+ FindFunctions (name, m_method_name_to_function_die, sc_list);
+
+ if (name_type_mask & eFunctionNameTypeSelector)
+ FindFunctions (name, m_selector_name_to_function_die, sc_list);
+
// Return the number of variable that were appended to the list
return sc_list.GetSize() - original_size;
}
@@ -1971,14 +2005,14 @@ SymbolFileDWARF::FindFunctions(const RegularExpression& regex, bool append, Symb
// Create the pubnames information so we can quickly lookup external symbols by name
// Create the pubnames information so we can quickly lookup external symbols by name
- const size_t num_entries = m_name_to_function_die.GetSize();
+ const size_t num_entries = m_full_name_to_function_die.GetSize();
SymbolContext sc;
for (size_t i=0; i<num_entries; i++)
{
- if (!regex.Execute(m_name_to_function_die.GetCStringAtIndex (i)))
+ if (!regex.Execute(m_full_name_to_function_die.GetCStringAtIndex (i)))
continue;
- const dw_offset_t die_offset = *m_name_to_function_die.GetValueAtIndex (i);
+ const dw_offset_t die_offset = *m_full_name_to_function_die.GetValueAtIndex (i);
DWARFCompileUnitSP cu_sp;
const DWARFDebugInfoEntry* die = DebugInfo()->GetDIEPtr (die_offset, &cu_sp);
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
index 95545a4844e..c2ad9720b34 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
@@ -97,7 +97,7 @@ public:
virtual uint32_t ResolveSymbolContext (const lldb_private::FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, lldb_private::SymbolContextList& sc_list);
virtual uint32_t FindGlobalVariables(const lldb_private::ConstString &name, bool append, uint32_t max_matches, lldb_private::VariableList& variables);
virtual uint32_t FindGlobalVariables(const lldb_private::RegularExpression& regex, bool append, uint32_t max_matches, lldb_private::VariableList& variables);
- virtual uint32_t FindFunctions(const lldb_private::ConstString &name, bool append, lldb_private::SymbolContextList& sc_list);
+ virtual uint32_t FindFunctions(const lldb_private::ConstString &name, uint32_t name_type_mask, bool append, lldb_private::SymbolContextList& sc_list);
virtual uint32_t FindFunctions(const lldb_private::RegularExpression& regex, bool append, lldb_private::SymbolContextList& sc_list);
// virtual uint32_t FindTypes(const lldb_private::SymbolContext& sc, const lldb_private::ConstString &name, bool append, uint32_t max_matches, lldb::Type::Encoding encoding, lldb::user_id_t udt_uid, lldb_private::TypeList& types);
// virtual uint32_t FindTypes(const lldb_private::SymbolContext& sc, const lldb_private::RegularExpression& regex, bool append, uint32_t max_matches, lldb::Type::Encoding encoding, lldb::user_id_t udt_uid, lldb_private::TypeList& types);
@@ -277,6 +277,11 @@ protected:
uint32_t& byte_stride,
uint32_t& bit_stride);
+ void FindFunctions(
+ const lldb_private::ConstString &name,
+ lldb_private::UniqueCStringMap<dw_offset_t> &name_to_die,
+ lldb_private::SymbolContextList& sc_list);
+
lldb_private::Type* GetUniquedTypeForDIEOffset(dw_offset_t type_die_offset, lldb::TypeSP& owning_type_sp, int32_t child_type, uint32_t idx, bool safe);
lldb::TypeSP GetTypeForDIE(DWARFCompileUnit *cu, const DWARFDebugInfoEntry* die, lldb::TypeSP& owning_type_sp, int32_t child_type, uint32_t idx);
// uint32_t FindTypes(std::vector<dw_offset_t> die_offsets, uint32_t max_matches, Type::Encoding encoding, lldb::user_id_t udt_uid, TypeList& types);
@@ -303,8 +308,10 @@ protected:
std::auto_ptr<DWARFDebugAranges> m_aranges;
std::auto_ptr<DWARFDebugInfo> m_info;
std::auto_ptr<DWARFDebugLine> m_line;
- lldb_private::UniqueCStringMap<dw_offset_t> m_name_to_function_die; // All concrete functions
- lldb_private::UniqueCStringMap<dw_offset_t> m_name_to_inlined_die; // All inlined functions
+ lldb_private::UniqueCStringMap<dw_offset_t> m_base_name_to_function_die; // All concrete functions
+ lldb_private::UniqueCStringMap<dw_offset_t> m_full_name_to_function_die; // All concrete functions
+ lldb_private::UniqueCStringMap<dw_offset_t> m_method_name_to_function_die; // All inlined functions
+ lldb_private::UniqueCStringMap<dw_offset_t> m_selector_name_to_function_die; // All method names for functions of classes
lldb_private::UniqueCStringMap<dw_offset_t> m_name_to_global_die; // Global and static variables
lldb_private::UniqueCStringMap<dw_offset_t> m_name_to_type_die; // All type DIE offsets
bool m_indexed;
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
index 7bf968dd9ce..9da672f948b 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
@@ -763,7 +763,7 @@ SymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithIndex (uint32_t symbol_i
}
uint32_t
-SymbolFileDWARFDebugMap::FindFunctions(const ConstString &name, bool append, SymbolContextList& sc_list)
+SymbolFileDWARFDebugMap::FindFunctions(const ConstString &name, uint32_t name_type_mask, bool append, SymbolContextList& sc_list)
{
Timer scoped_timer (__PRETTY_FUNCTION__,
"SymbolFileDWARFDebugMap::FindFunctions (name = %s)",
@@ -788,7 +788,7 @@ SymbolFileDWARFDebugMap::FindFunctions(const ConstString &name, bool append, Sym
{
SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx);
if (oso_dwarf)
- oso_dwarf->FindFunctions(name, true, sc_list);
+ oso_dwarf->FindFunctions(name, name_type_mask, true, sc_list);
}
}
// Stream s(stdout);
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
index 0a312ab9f26..d5e2b51e93c 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
@@ -64,7 +64,7 @@ public:
virtual uint32_t ResolveSymbolContext (const lldb_private::FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, lldb_private::SymbolContextList& sc_list);
virtual uint32_t FindGlobalVariables (const lldb_private::ConstString &name, bool append, uint32_t max_matches, lldb_private::VariableList& variables);
virtual uint32_t FindGlobalVariables (const lldb_private::RegularExpression& regex, bool append, uint32_t max_matches, lldb_private::VariableList& variables);
- virtual uint32_t FindFunctions (const lldb_private::ConstString &name, bool append, lldb_private::SymbolContextList& sc_list);
+ virtual uint32_t FindFunctions (const lldb_private::ConstString &name, uint32_t name_type_mask, bool append, lldb_private::SymbolContextList& sc_list);
virtual uint32_t FindFunctions (const lldb_private::RegularExpression& regex, bool append, lldb_private::SymbolContextList& sc_list);
// virtual uint32_t FindTypes (const lldb_private::SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, Type::Encoding encoding, lldb::user_id_t udt_uid, TypeList& types);
// virtual uint32_t FindTypes (const lldb_private::SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, lldb::user_id_t udt_uid, TypeList& types);
diff --git a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp
index d7da35675c7..ff7b8bf742a 100644
--- a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp
+++ b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp
@@ -308,7 +308,7 @@ SymbolFileSymtab::FindGlobalVariables(const RegularExpression& regex, bool appen
}
uint32_t
-SymbolFileSymtab::FindFunctions(const ConstString &name, bool append, SymbolContextList& sc_list)
+SymbolFileSymtab::FindFunctions(const ConstString &name, uint32_t name_type_mask, bool append, SymbolContextList& sc_list)
{
Timer scoped_timer (__PRETTY_FUNCTION__,
"SymbolFileSymtab::FindFunctions (name = '%s')",
diff --git a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h
index ac73f294585..e3eeb29bb70 100644
--- a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h
+++ b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h
@@ -87,7 +87,7 @@ public:
FindGlobalVariables(const lldb_private::RegularExpression& regex, bool append, uint32_t max_matches, lldb_private::VariableList& variables);
virtual uint32_t
- FindFunctions(const lldb_private::ConstString &name, bool append, lldb_private::SymbolContextList& sc_list);
+ FindFunctions(const lldb_private::ConstString &name, uint32_t name_type_mask, bool append, lldb_private::SymbolContextList& sc_list);
virtual uint32_t
FindFunctions(const lldb_private::RegularExpression& regex, bool append, lldb_private::SymbolContextList& sc_list);
diff --git a/lldb/source/Symbol/Block.cpp b/lldb/source/Symbol/Block.cpp
index 321411940f4..ab998cb1795 100644
--- a/lldb/source/Symbol/Block.cpp
+++ b/lldb/source/Symbol/Block.cpp
@@ -57,6 +57,30 @@ Block::~Block ()
}
void
+Block::GetDescription(Stream *s, lldb::DescriptionLevel level, Process *process) const
+{
+ size_t num_ranges = m_ranges.size();
+ if (num_ranges)
+ {
+
+ addr_t base_addr = LLDB_INVALID_ADDRESS;
+ if (process)
+ base_addr = m_block_list->GetAddressRange().GetBaseAddress().GetLoadAddress(process);
+ if (base_addr == LLDB_INVALID_ADDRESS)
+ base_addr = m_block_list->GetAddressRange().GetBaseAddress().GetFileAddress();
+
+ s->Printf("range%s = ", num_ranges > 1 ? "s" : "");
+ std::vector<VMRange>::const_iterator pos, end = m_ranges.end();
+ for (pos = m_ranges.begin(); pos != end; ++pos)
+ pos->Dump(s, base_addr, 4);
+ }
+ *s << ", id = " << ((const UserID&)*this);
+
+ if (m_inlineInfoSP.get() != NULL)
+ m_inlineInfoSP->Dump(s);
+}
+
+void
Block::Dump(Stream *s, addr_t base_addr, int32_t depth, bool show_context) const
{
if (depth < 0)
@@ -69,12 +93,10 @@ Block::Dump(Stream *s, addr_t base_addr, int32_t depth, bool show_context) const
s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
s->Indent();
*s << "Block" << ((const UserID&)*this);
- user_id_t parentID = GetParentUID();
- const Block* parent_block = NULL;
- if (parentID != Block::InvalidID)
+ const Block* parent_block = GetParent();
+ if (parent_block)
{
- parent_block = m_block_list->GetBlockByID(parentID);
- s->Printf(", parent = {0x%8.8x}", parentID);
+ s->Printf(", parent = {0x%8.8x}", parent_block->GetID());
}
if (m_inlineInfoSP.get() != NULL)
m_inlineInfoSP->Dump(s);
@@ -128,10 +150,7 @@ Block::CalculateSymbolContext(SymbolContext* sc)
void
Block::DumpStopContext (Stream *s, const SymbolContext *sc)
{
- user_id_t parentID = GetParentUID();
- Block* parent_block = NULL;
- if (parentID != Block::InvalidID)
- parent_block = m_block_list->GetBlockByID(parentID);
+ Block* parent_block = GetParent();
InlineFunctionInfo* inline_info = InlinedFunctionInfo ();
if (inline_info)
@@ -256,6 +275,24 @@ Block::MemorySize() const
}
+Block *
+Block::GetParent () const
+{
+ return m_block_list->GetBlockByID (m_block_list->GetParent(GetID()));
+}
+
+Block *
+Block::GetSibling () const
+{
+ return m_block_list->GetBlockByID (m_block_list->GetSibling(GetID()));
+}
+
+Block *
+Block::GetFirstChild () const
+{
+ return m_block_list->GetBlockByID (m_block_list->GetFirstChild(GetID()));
+}
+
user_id_t
Block::GetParentUID() const
{
@@ -455,7 +492,7 @@ BlockList::AddChild (user_id_t parentID, user_id_t childID)
const Block *
BlockList::GetBlockByID(user_id_t blockID) const
{
- if (m_blocks.empty())
+ if (m_blocks.empty() || blockID == Block::InvalidID)
return NULL;
if (blockID == Block::RootID)
@@ -471,7 +508,7 @@ BlockList::GetBlockByID(user_id_t blockID) const
Block *
BlockList::GetBlockByID(user_id_t blockID)
{
- if (m_blocks.empty())
+ if (m_blocks.empty() || blockID == Block::InvalidID)
return NULL;
if (blockID == Block::RootID)
@@ -584,16 +621,13 @@ Block::GetVariableList (bool get_child_variables, bool can_create)
if (get_child_variables)
{
- user_id_t block_id = GetFirstChildUID();
- while (block_id != Block::InvalidID)
+ Block *child_block = GetFirstChild();
+ while (child_block)
{
- Block *child_block = m_block_list->GetBlockByID(block_id);
- assert(child_block);
VariableListSP child_block_variable_list(child_block->GetVariableList(get_child_variables, can_create));
if (child_block_variable_list.get())
variable_list_sp->AddVariables(child_block_variable_list.get());
-
- block_id = child_block->GetSiblingUID();
+ child_block = child_block->GetSibling();
}
}
}
@@ -615,13 +649,9 @@ Block::AppendVariables (bool can_create, bool get_parent_variables, VariableList
if (get_parent_variables)
{
- user_id_t parentID = GetParentUID();
- if (parentID != Block::InvalidID)
- {
- Block* parent_block = m_block_list->GetBlockByID(parentID);
- if (parent_block)
- num_variables_added += parent_block->AppendVariables (can_create, get_parent_variables, variable_list);
- }
+ Block* parent_block = GetParent();
+ if (parent_block)
+ num_variables_added += parent_block->AppendVariables (can_create, get_parent_variables, variable_list);
}
return num_variables_added;
}
diff --git a/lldb/source/Symbol/CompileUnit.cpp b/lldb/source/Symbol/CompileUnit.cpp
index 60a893b1d1e..7c60c1b9841 100644
--- a/lldb/source/Symbol/CompileUnit.cpp
+++ b/lldb/source/Symbol/CompileUnit.cpp
@@ -65,6 +65,13 @@ CompileUnit::DumpSymbolContext(Stream *s)
}
+void
+CompileUnit::GetDescription(Stream *s, lldb::DescriptionLevel level) const
+{
+ *s << '"' << (const FileSpec&)*this << "\", id = " << (const UserID&)*this
+ << ", language = " << (const Language&)*this;
+}
+
//----------------------------------------------------------------------
// Dump the current contents of this object. No functions that cause on
diff --git a/lldb/source/Symbol/Declaration.cpp b/lldb/source/Symbol/Declaration.cpp
index a31a304b06f..d53d90051c5 100644
--- a/lldb/source/Symbol/Declaration.cpp
+++ b/lldb/source/Symbol/Declaration.cpp
@@ -61,12 +61,11 @@ Declaration::Dump(Stream *s) const
{
if (m_file)
{
- *s << ", decl = '" << m_file;
+ *s << ", decl = " << m_file;
if (m_line > 0)
s->Printf(":%u", m_line);
if (m_column > 0)
s->Printf(":%u", m_column);
- s->PutChar('\'');
}
else
{
diff --git a/lldb/source/Symbol/Function.cpp b/lldb/source/Symbol/Function.cpp
index 51c449acd93..57f6cb4cd55 100644
--- a/lldb/source/Symbol/Function.cpp
+++ b/lldb/source/Symbol/Function.cpp
@@ -261,6 +261,16 @@ Function::GetCompileUnit() const
return m_comp_unit;
}
+
+void
+Function::GetDescription(Stream *s, lldb::DescriptionLevel level, Process *process)
+{
+ Type* func_type = GetType();
+ *s << '"' << func_type->GetName() << "\", id = " << (const UserID&)*this;
+ *s << ", range = ";
+ GetAddressRange().Dump(s, process, Address::DumpStyleLoadAddress, Address::DumpStyleModuleWithFileAddress);
+}
+
void
Function::Dump(Stream *s, bool show_context) const
{
diff --git a/lldb/source/Symbol/LineEntry.cpp b/lldb/source/Symbol/LineEntry.cpp
index cdc3c54eaa3..fb362b9d295 100644
--- a/lldb/source/Symbol/LineEntry.cpp
+++ b/lldb/source/Symbol/LineEntry.cpp
@@ -118,14 +118,12 @@ LineEntry::Dump
fallback_style))
return false;
}
+ if (show_file)
+ *s << ", file = " << file;
if (line)
s->Printf(", line = %u", line);
if (column)
s->Printf(", column = %u", column);
- if (show_file)
- {
- *s << ", file = " << file;
- }
if (is_start_of_statement)
*s << ", is_start_of_statement = TRUE";
@@ -144,13 +142,22 @@ LineEntry::Dump
}
bool
-LineEntry::GetDescription (Stream *s, lldb::DescriptionLevel level, CompileUnit* cu, Process *process) const
+LineEntry::GetDescription (Stream *s, lldb::DescriptionLevel level, CompileUnit* cu, Process *process, bool show_address_only) const
{
if (level == lldb::eDescriptionLevelBrief || level == lldb::eDescriptionLevelFull)
{
// Show address only
- range.GetBaseAddress().Dump(s, process, Address::DumpStyleLoadAddress, Address::DumpStyleFileAddress);
+ if (show_address_only)
+ {
+ s->PutCString ("address = ");
+ range.GetBaseAddress().Dump(s, process, Address::DumpStyleLoadAddress, Address::DumpStyleFileAddress);
+ }
+ else
+ {
+ s->PutCString ("range = ");
+ range.Dump(s, process, Address::DumpStyleLoadAddress, Address::DumpStyleFileAddress);
+ }
if (file)
*s << ' ' << file;
diff --git a/lldb/source/Symbol/LineTable.cpp b/lldb/source/Symbol/LineTable.cpp
index 05393352a02..cd83665cf4a 100644
--- a/lldb/source/Symbol/LineTable.cpp
+++ b/lldb/source/Symbol/LineTable.cpp
@@ -324,7 +324,7 @@ LineTable::GetDescription (Stream *s, Process *process, DescriptionLevel level)
for (size_t idx = 0; idx < count; ++idx)
{
ConvertEntryAtIndexToLineEntry (idx, line_entry);
- line_entry.GetDescription (s, level, m_comp_unit, process);
+ line_entry.GetDescription (s, level, m_comp_unit, process, true);
s->EOL();
}
}
diff --git a/lldb/source/Symbol/Symbol.cpp b/lldb/source/Symbol/Symbol.cpp
index fd3e4afb23e..6c91dd41958 100644
--- a/lldb/source/Symbol/Symbol.cpp
+++ b/lldb/source/Symbol/Symbol.cpp
@@ -168,6 +168,26 @@ Symbol::IsTrampoline () const
}
void
+Symbol::GetDescription (Stream *s, lldb::DescriptionLevel level, Process *process) const
+{
+ *s << '"' << m_mangled.GetName() << "\", id = " << (const UserID&)*this;
+ const Section *section = m_addr_range.GetBaseAddress().GetSection();
+ if (section != NULL)
+ {
+ if (m_addr_range.GetByteSize() > 0)
+ {
+ s->PutCString(", range = ");
+ m_addr_range.Dump(s, process, Address::DumpStyleLoadAddress, Address::DumpStyleModuleWithFileAddress);
+ }
+ else
+ {
+ s->PutCString(", address = ");
+ m_addr_range.GetBaseAddress().Dump(s, process, Address::DumpStyleLoadAddress, Address::DumpStyleModuleWithFileAddress);
+ }
+ }
+}
+
+void
Symbol::Dump(Stream *s, Process *process, uint32_t index) const
{
// s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
diff --git a/lldb/source/Symbol/SymbolContext.cpp b/lldb/source/Symbol/SymbolContext.cpp
index 0a33d5adbf0..eca278e0ac8 100644
--- a/lldb/source/Symbol/SymbolContext.cpp
+++ b/lldb/source/Symbol/SymbolContext.cpp
@@ -8,12 +8,13 @@
//===----------------------------------------------------------------------===//
#include "lldb/Symbol/SymbolContext.h"
-#include "lldb/Symbol/CompileUnit.h"
+
#include "lldb/Core/Module.h"
+#include "lldb/Symbol/CompileUnit.h"
#include "lldb/Symbol/ObjectFile.h"
#include "lldb/Symbol/Symbol.h"
-#include "lldb/Target/Target.h"
#include "lldb/Symbol/SymbolVendor.h"
+#include "lldb/Target/Target.h"
using namespace lldb;
using namespace lldb_private;
@@ -169,6 +170,81 @@ SymbolContext::DumpStopContext
}
void
+SymbolContext::GetDescription(Stream *s, lldb::DescriptionLevel level, Process *process) const
+{
+ if (module_sp)
+ {
+ s->Indent(" Module: \"");
+ module_sp->GetFileSpec().Dump(s);
+ s->PutChar('"');
+ s->EOL();
+ }
+
+ if (comp_unit != NULL)
+ {
+ s->Indent("CompileUnit: ");
+ comp_unit->GetDescription (s, level);
+ s->EOL();
+ }
+
+ if (function != NULL)
+ {
+ s->Indent(" Function: ");
+ function->GetDescription (s, level, process);
+ s->EOL();
+
+ Type *func_type = function->GetType();
+ if (func_type)
+ {
+ s->Indent(" FuncType: ");
+ func_type->GetDescription (s, level, false);
+ s->EOL();
+ }
+ }
+
+ if (block != NULL)
+ {
+ std::vector<Block *> blocks;
+ blocks.push_back (block);
+ Block *parent_block = block->GetParent();
+
+ while (parent_block)
+ {
+ blocks.push_back (parent_block);
+ parent_block = parent_block->GetParent();
+ }
+ std::vector<Block *>::reverse_iterator pos;
+ std::vector<Block *>::reverse_iterator begin = blocks.rbegin();
+ std::vector<Block *>::reverse_iterator end = blocks.rend();
+ for (pos = begin; pos != end; ++pos)
+ {
+ if (pos == begin)
+ s->Indent(" Blocks: ");
+ else
+ s->Indent(" ");
+ (*pos)->GetDescription(s, level, process);
+ s->EOL();
+ }
+ }
+
+ if (line_entry.IsValid())
+ {
+ s->Indent(" LineEntry: ");
+ line_entry.GetDescription (s, level, comp_unit, process, false);
+ s->EOL();
+ }
+
+ if (symbol != NULL)
+ {
+ s->Indent(" Symbol: ");
+ symbol->GetDescription(s, level, process);
+ s->EOL();
+ }
+}
+
+
+
+void
SymbolContext::Dump(Stream *s, Process *process) const
{
*s << (void *)this << ": ";
@@ -178,48 +254,45 @@ SymbolContext::Dump(Stream *s, Process *process) const
s->EOL();
s->IndentMore();
s->Indent();
- *s << "Module = " << (void *)module_sp.get() << ' ';
+ *s << "Module = " << (void *)module_sp.get() << ' ';
if (module_sp)
module_sp->GetFileSpec().Dump(s);
s->EOL();
s->Indent();
*s << "CompileUnit = " << (void *)comp_unit;
if (comp_unit != NULL)
- *s << " {" << comp_unit->GetID() << "} " << *(dynamic_cast<FileSpec*> (comp_unit));
+ *s << " {0x" << comp_unit->GetID() << "} " << *(dynamic_cast<FileSpec*> (comp_unit));
s->EOL();
s->Indent();
- *s << "Function = " << (void *)function;
+ *s << "Function = " << (void *)function;
if (function != NULL)
{
- *s << " {" << function->GetID() << "} ";/// << function->GetType()->GetName();
-// Type* func_type = function->Type();
-// if (func_type)
-// {
-// s->EOL();
-// const UserDefType* func_udt = func_type->GetUserDefinedType().get();
-// if (func_udt)
-// {
-// s->IndentMore();
-// func_udt->Dump(s, func_type);
-// s->IndentLess();
-// }
-// }
+ *s << " {0x" << function->GetID() << "} " << function->GetType()->GetName() << ", address-range = ";
+ function->GetAddressRange().Dump(s, process, Address::DumpStyleLoadAddress, Address::DumpStyleModuleWithFileAddress);
+ s->EOL();
+ s->Indent();
+ Type* func_type = function->GetType();
+ if (func_type)
+ {
+ *s << " Type = ";
+ func_type->Dump (s, false);
+ }
}
s->EOL();
s->Indent();
- *s << "Block = " << (void *)block;
+ *s << "Block = " << (void *)block;
if (block != NULL)
- *s << " {" << block->GetID() << '}';
+ *s << " {0x" << block->GetID() << '}';
// Dump the block and pass it a negative depth to we print all the parent blocks
//if (block != NULL)
// block->Dump(s, function->GetFileAddress(), INT_MIN);
s->EOL();
s->Indent();
- *s << "LineEntry = ";
+ *s << "LineEntry = ";
line_entry.Dump (s, process, true, Address::DumpStyleLoadAddress, Address::DumpStyleModuleWithFileAddress, true);
s->EOL();
s->Indent();
- *s << "Symbol = " << (void *)symbol;
+ *s << "Symbol = " << (void *)symbol;
if (symbol != NULL && symbol->GetMangled())
*s << ' ' << symbol->GetMangled().GetName().AsCString();
s->EOL();
@@ -313,7 +386,7 @@ SymbolContext::FindFunctionByName (const char *name) const
if (module_sp != NULL)
{
SymbolContextList sc_matches;
- if (module_sp->FindFunctions (name_const_str, false, sc_matches) > 0)
+ if (module_sp->FindFunctions (name_const_str, eFunctionNameTypeBase | eFunctionNameTypeFull, false, sc_matches) > 0)
{
SymbolContext sc;
sc_matches.GetContextAtIndex (0, sc);
@@ -324,7 +397,7 @@ SymbolContext::FindFunctionByName (const char *name) const
if (target_sp)
{
SymbolContextList sc_matches;
- if (target_sp->GetImages().FindFunctions (name_const_str, sc_matches) > 0)
+ if (target_sp->GetImages().FindFunctions (name_const_str, eFunctionNameTypeBase | eFunctionNameTypeFull, sc_matches) > 0)
{
SymbolContext sc;
sc_matches.GetContextAtIndex (0, sc);
diff --git a/lldb/source/Symbol/SymbolVendor.cpp b/lldb/source/Symbol/SymbolVendor.cpp
index 5fb8b0ab8d1..b4c4f83e56b 100644
--- a/lldb/source/Symbol/SymbolVendor.cpp
+++ b/lldb/source/Symbol/SymbolVendor.cpp
@@ -234,11 +234,11 @@ SymbolVendor::FindGlobalVariables (const RegularExpression& regex, bool append,
}
uint32_t
-SymbolVendor::FindFunctions(const ConstString &name, bool append, SymbolContextList& sc_list)
+SymbolVendor::FindFunctions(const ConstString &name, uint32_t name_type_mask, bool append, SymbolContextList& sc_list)
{
Mutex::Locker locker(m_mutex);
if (m_sym_file_ap.get())
- return m_sym_file_ap->FindFunctions(name, append, sc_list);
+ return m_sym_file_ap->FindFunctions(name, name_type_mask, append, sc_list);
return 0;
}
diff --git a/lldb/source/Symbol/Type.cpp b/lldb/source/Symbol/Type.cpp
index 9338ea2839a..4735d0560aa 100644
--- a/lldb/source/Symbol/Type.cpp
+++ b/lldb/source/Symbol/Type.cpp
@@ -97,6 +97,81 @@ lldb_private::Type::operator= (const Type& rhs)
void
+lldb_private::Type::GetDescription (Stream *s, lldb::DescriptionLevel level, bool show_name)
+{
+ if (show_name)
+ {
+ if (m_name)
+ *s << '\"' << m_name << "\", ";
+ }
+
+ *s << "id = " << (const UserID&)*this;
+
+ if (m_byte_size != 0)
+ s->Printf(", byte-size = %zu", m_byte_size);
+
+ m_decl.Dump(s);
+
+ clang::QualType qual_type(clang::QualType::getFromOpaquePtr(m_clang_qual_type));
+
+ if (qual_type.getTypePtr())
+ {
+ *s << ", type = ";
+
+ clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type.getTypePtr());
+ clang::TagDecl *tag_decl = NULL;
+ if (tag_type)
+ tag_decl = tag_type->getDecl();
+
+ if (tag_decl)
+ {
+ s->EOL();
+ s->EOL();
+ tag_decl->print(llvm::fouts(), 0);
+ s->EOL();
+ }
+ else
+ {
+ const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
+ if (typedef_type)
+ {
+ const clang::TypedefDecl *typedef_decl = typedef_type->getDecl();
+ std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString());
+ if (!clang_typedef_name.empty())
+ *s << ' ' << clang_typedef_name.c_str();
+ }
+ else
+ {
+ // We have a clang type, lets show it
+ clang::ASTContext *ast_context = GetClangAST();
+ if (ast_context)
+ {
+ std::string clang_type_name(qual_type.getAsString());
+ if (!clang_type_name.empty())
+ *s << ' ' << clang_type_name.c_str();
+ }
+ }
+ }
+ }
+ else if (m_encoding_uid != LLDB_INVALID_UID)
+ {
+ *s << ", type_uid = " << m_encoding_uid;
+ switch (m_encoding_uid_type)
+ {
+ case eIsTypeWithUID: s->PutCString(" (unresolved type)"); break;
+ case eIsConstTypeWithUID: s->PutCString(" (unresolved const type)"); break;
+ case eIsRestrictTypeWithUID: s->PutCString(" (unresolved restrict type)"); break;
+ case eIsVolatileTypeWithUID: s->PutCString(" (unresolved volatile type)"); break;
+ case eTypedefToTypeWithUID: s->PutCString(" (unresolved typedef)"); break;
+ case ePointerToTypeWithUID: s->PutCString(" (unresolved pointer)"); break;
+ case eLValueReferenceToTypeWithUID: s->PutCString(" (unresolved L value reference)"); break;
+ case eRValueReferenceToTypeWithUID: s->PutCString(" (unresolved R value reference)"); break;
+ }
+ }
+}
+
+
+void
lldb_private::Type::Dump (Stream *s, bool show_context)
{
s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
@@ -148,16 +223,12 @@ lldb_private::Type::Dump (Stream *s, bool show_context)
else
{
// We have a clang type, lets show it
- TypeList *type_list = GetTypeList();
- if (type_list)
+ clang::ASTContext *ast_context = GetClangAST();
+ if (ast_context)
{
- clang::ASTContext *ast_context = GetClangAST();
- if (ast_context)
- {
- std::string clang_type_name(qual_type.getAsString());
- if (!clang_type_name.empty())
- *s << " (" << clang_type_name.c_str() << ')';
- }
+ std::string clang_type_name(qual_type.getAsString());
+ if (!clang_type_name.empty())
+ *s << " (" << clang_type_name.c_str() << ')';
}
}
}
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index 1ba125ca653..cba72e90b3e 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -179,11 +179,16 @@ Target::CreateBreakpoint (Address &addr, bool internal)
}
BreakpointSP
-Target::CreateBreakpoint (FileSpec *containingModule, const char *func_name, bool internal)
+Target::CreateBreakpoint (FileSpec *containingModule, const char *func_name, uint32_t func_name_type_mask, bool internal)
{
- SearchFilterSP filter_sp(GetSearchFilterForModule (containingModule));
- BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL, func_name));
- return CreateBreakpoint (filter_sp, resolver_sp, internal);
+ BreakpointSP bp_sp;
+ if (func_name)
+ {
+ SearchFilterSP filter_sp(GetSearchFilterForModule (containingModule));
+ BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL, func_name, func_name_type_mask, Breakpoint::Exact));
+ bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal);
+ }
+ return bp_sp;
}
diff --git a/lldb/tools/driver/Driver.cpp b/lldb/tools/driver/Driver.cpp
index 9d9281bbae6..a77775a40aa 100644
--- a/lldb/tools/driver/Driver.cpp
+++ b/lldb/tools/driver/Driver.cpp
@@ -49,13 +49,13 @@ reset_stdin_termios ()
static lldb::OptionDefinition g_options[] =
{
- { LLDB_OPT_SET_1, true, "help", 'h', no_argument, NULL, NULL, NULL,
+ { LLDB_OPT_SET_1, true, "help", 'h', no_argument, NULL, NULL, NULL,
"Prints out the usage information for the LLDB debugger." },
- { LLDB_OPT_SET_2, true, "version", 'v', no_argument, NULL, NULL, NULL,
+ { LLDB_OPT_SET_2, true, "version", 'v', no_argument, NULL, NULL, NULL,
"Prints out the current version number of the LLDB debugger." },
- { LLDB_OPT_SET_3, false, "arch", 'a', required_argument, NULL, NULL, "<architecture>",
+ { LLDB_OPT_SET_3, true, "arch", 'a', required_argument, NULL, NULL, "<architecture>",
"Tells the debugger to use the specified architecture when starting and running the program. <architecture> must be one of the architectures for which the program was compiled." },
{ LLDB_OPT_SET_3 | LLDB_OPT_SET_4, false, "script-language",'l', required_argument, NULL, NULL, "<scripting-language>",
@@ -67,11 +67,11 @@ static lldb::OptionDefinition g_options[] =
{ LLDB_OPT_SET_3 | LLDB_OPT_SET_4, false, "source", 's', required_argument, NULL, NULL, "<file>",
"Tells the debugger to read in and execute the file <file>, which should contain lldb commands." },
- { LLDB_OPT_SET_3, false, "file", 'f', required_argument, NULL, NULL, "<filename>",
+ { LLDB_OPT_SET_3, true, "file", 'f', required_argument, NULL, NULL, "<filename>",
"Tells the debugger to use the file <filename> as the program to be debugged." },
- { LLDB_OPT_SET_4, false, "crash-log", 'c', required_argument, NULL, NULL, "<file>",
- "Load executable images from a crash log for symbolication." },
+// { LLDB_OPT_SET_4, true, "crash-log", 'c', required_argument, NULL, NULL, "<file>",
+// "Load executable images from a crash log for symbolication." },
{ 0, false, NULL, 0, 0, NULL, NULL, NULL, NULL }
};
OpenPOWER on IntegriCloud