<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.5pt;
        font-family:Consolas;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:Consolas;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoPlainText">> For instance, when running lang/c/strings/a.out with "log enable lldb expr", I see that ClangASTSource::FindExternalVisibleDecls fails to find strlen, resulting in "error: use of undeclared identifier 'strlen'". 
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">The attached logs suggest a missing call to ABISysV_x86_64::PrepareTrivialCall.  It could be that your refactoring isn't consistent with support for GNU indirection functions introduced in
<a href="http://llvm.org/viewvc/llvm-project?rev=176206&view=rev">r176206</a>.  Specifically, there is no longer a code path that leads to InferiorCall in InferiorCallPOSIX.cpp (see the expected call stack below).<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">I expect that the root cause is related to the fact that FindFunctions returns an sc_list with size 0 rather than 1.  Do you have access to the buildbot to reproduce this?  The failure seems widespread enough that it should be straightforward
 to repro…<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">- Ashok<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Courier New"">(gdb) bt 10<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Courier New"">#0  lldb_private::InferiorCall (process=0x1026b80, address=0x7ffff7e685f8, returned_func=@0x7fffffff2450: 18446744073709551615) at /home/athirumurthi/git/lldb/tools/lldb/source/Plugins/Process/Utility/InferiorCallPOSIX.cpp:214<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Courier New"">#1  0x00007ffff2d0aa10 in ProcessPOSIX::ResolveIndirectFunction (this=0x1026b80, address=0x7ffff7e685f8, error=...) at /home/athirumurthi/git/lldb/tools/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.cpp:496<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Courier New"">#2  0x00007ffff1861fa8 in lldb_private::Address::GetCallableLoadAddress (this=0x7ffff7e685f8, target=0x1015820, is_indirect=true) at /home/athirumurthi/git/lldb/tools/lldb/source/Core/Address.cpp:320<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Courier New"">#3  0x00007ffff19c7d96 in lldb_private::ClangExpressionDeclMap::AddOneFunction (this=0x10b2c60, context=..., fun=0x0, symbol=0x7ffff7e685d0, current_id=8) at /home/athirumurthi/git/lldb/tools/lldb/source/Expression/ClangExpressionDeclMap.cpp:3707<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Courier New"">#4  0x00007ffff19c6ae0 in lldb_private::ClangExpressionDeclMap::FindExternalVisibleDecls (this=0x10b2c60, context=..., module_sp=..., namespace_decl=..., current_id=8)
 at /home/athirumurthi/git/lldb/tools/lldb/source/Expression/ClangExpressionDeclMap.cpp:3168<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Courier New"">#5  0x00007ffff19c4f6a in lldb_private::ClangExpressionDeclMap::FindExternalVisibleDecls (this=0x10b2c60, context=...) at /home/athirumurthi/git/lldb/tools/lldb/source/Expression/ClangExpressionDeclMap.cpp:2692<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Courier New"">#6  0x00007ffff19a6104 in lldb_private::ClangASTSource::FindExternalVisibleDeclsByName (this=0x10b2c60, decl_ctx=0x1127650, clang_decl_name=...) at /home/athirumurthi/git/lldb/tools/lldb/source/Expression/ClangASTSource.cpp:162<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Courier New"">#7  0x00007ffff19d65ee in lldb_private::ClangASTSource::ClangASTSourceProxy::FindExternalVisibleDeclsByName(clang::DeclContext const*, clang::DeclarationName) () from /home/athirumurthi/git/lldb/build/Debug+Asserts/lib/python2.7/site-packages/lldb/_lldb.so<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Courier New"">#8  0x00007ffff1f7cd38 in clang::DeclContext::lookup (this=0x1127650, Name=...) at /home/athirumurthi/git/lldb/tools/clang/lib/AST/DeclBase.cpp:1233<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Courier New"">#9  0x00007ffff1f7f671 in clang::DeclContext::lookup (this=0x1127650, Name=...) at /home/athirumurthi/git/lldb/tools/clang/lib/AST/../../include/clang/AST/DeclBase.h:1424<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Courier New"">(More stack frames follow...)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">-----Original Message-----<br>
From: Greg Clayton [mailto:gclayton@apple.com] <br>
Sent: Wednesday, April 10, 2013 10:14 PM<br>
To: Thirumurthi, Ashok<br>
Cc: lldb-commits@cs.uiuc.edu<br>
Subject: Re: Linux regressions with r178608<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">To track this down we should do this on linux:<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">1 - build LLDB with a revision just prior to this fix<o:p></o:p></p>
<p class="MsoPlainText">2 - enable expression logging: log enable -f /tmp/old-expr.txt lldb expr<o:p></o:p></p>
<p class="MsoPlainText">3 - debug and run your '(int)strlen("hello")' expression<o:p></o:p></p>
<p class="MsoPlainText">4 - build top of tree LLDB<o:p></o:p></p>
<p class="MsoPlainText">5 - enable expression logging: log enable -f /tmp/new-expr.txt lldb expr<o:p></o:p></p>
<p class="MsoPlainText">6 - debug and run your '(int)strlen("hello")' expression<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">See what changed and what lookups failed or changed. This will help us determine what is wrong.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Greg<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">On Apr 10, 2013, at 2:53 PM, "Thirumurthi, Ashok" <<a href="mailto:ashok.thirumurthi@intel.com"><span style="color:windowtext;text-decoration:none">ashok.thirumurthi@intel.com</span></a>> wrote:<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">> Hi Greg,<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Would you have some advice to deal with the regressions introduced by r178608?  These occur in expression evaluation when functions are called on Linux. The buildbot lists the following failures currently, and I was able to reproduce
 the first 4 with r178608.<o:p></o:p></p>
<p class="MsoPlainText">>  FAIL: LLDB :: (TestCStrings.py)<o:p></o:p></p>
<p class="MsoPlainText">>    AssertionError: False is not True : Command 'expression -- (int)strlen("hello")' returns successfully<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">>  FAIL: LLDB :: (TestFunctionTypes.py)<o:p></o:p></p>
<p class="MsoPlainText">>    AssertionError: False is not True : Command 'expr string_not_empty' returns successfully<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">>  FAIL: LLDB :: (TestCallWithTimeout.py)<o:p></o:p></p>
<p class="MsoPlainText">>    self.assertTrue (value.GetError().Success() == True)   
<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">>  FAIL: LLDB :: (TestExprs.py)<o:p></o:p></p>
<p class="MsoPlainText">>    AssertionError: False is not True : Command 'expression -i true -- a_function_to_call()' returns successfully<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">>  FAIL: LLDB :: (TestCPPStaticMethods.py)<o:p></o:p></p>
<p class="MsoPlainText">>    AssertionError: False is not True : Command 'expression -- A::getStaticValue()' returns successfully<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> For instance, when running lang/c/strings/a.out with "log enable lldb expr", I see that ClangASTSource::FindExternalVisibleDecls fails to find strlen, resulting in "error: use of undeclared identifier 'strlen'". 
<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Thanks,<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> - Ashok<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -----Original Message-----<o:p></o:p></p>
<p class="MsoPlainText">> From: <a href="mailto:lldb-commits-bounces@cs.uiuc.edu">
<span style="color:windowtext;text-decoration:none">lldb-commits-bounces@cs.uiuc.edu</span></a> [<a href="mailto:lldb-commits-bounces@cs.uiuc.edu"><span style="color:windowtext;text-decoration:none">mailto:lldb-commits-bounces@cs.uiuc.edu</span></a>] On Behalf
 Of Greg Clayton<o:p></o:p></p>
<p class="MsoPlainText">> Sent: Tuesday, April 02, 2013 10:00 PM<o:p></o:p></p>
<p class="MsoPlainText">> To: <a href="mailto:lldb-commits@cs.uiuc.edu"><span style="color:windowtext;text-decoration:none">lldb-commits@cs.uiuc.edu</span></a><o:p></o:p></p>
<p class="MsoPlainText">> Subject: [Lldb-commits] [lldb] r178608 - <rdar://problem/13506727><o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Author: gclayton<o:p></o:p></p>
<p class="MsoPlainText">> Date: Tue Apr  2 21:00:15 2013<o:p></o:p></p>
<p class="MsoPlainText">> New Revision: 178608<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=178608&view=rev">
<span style="color:windowtext;text-decoration:none">http://llvm.org/viewvc/llvm-project?rev=178608&view=rev</span></a><o:p></o:p></p>
<p class="MsoPlainText">> Log:<o:p></o:p></p>
<p class="MsoPlainText">> <rdar://problem/13506727> <o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Symbol table function names should support lookups like symbols with debug info.
<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> To fix this I:<o:p></o:p></p>
<p class="MsoPlainText">> - Gutted the way FindFunctions is used, there used to be way too much smarts only in the DWARF plug-in<o:p></o:p></p>
<p class="MsoPlainText">> - Made it more efficient by chopping the name up once and using simpler queries so that SymbolFile and Symtab plug-ins don't need to do as much<o:p></o:p></p>
<p class="MsoPlainText">> - Filter the results at a higher level<o:p></o:p></p>
<p class="MsoPlainText">> - Make the lldb_private::Symtab able to chop up C++ mangled names and make as much sense out of them as possible and also be able to search by basename, fullname, method name, and selector name.<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Modified:<o:p></o:p></p>
<p class="MsoPlainText">>    lldb/trunk/include/lldb/Breakpoint/BreakpointResolverName.h<o:p></o:p></p>
<p class="MsoPlainText">>    lldb/trunk/include/lldb/Core/Module.h<o:p></o:p></p>
<p class="MsoPlainText">>    lldb/trunk/include/lldb/Symbol/SymbolContext.h<o:p></o:p></p>
<p class="MsoPlainText">>    lldb/trunk/include/lldb/Symbol/Symtab.h<o:p></o:p></p>
<p class="MsoPlainText">>    lldb/trunk/include/lldb/Target/CPPLanguageRuntime.h<o:p></o:p></p>
<p class="MsoPlainText">>    lldb/trunk/source/Breakpoint/BreakpointResolverName.cpp<o:p></o:p></p>
<p class="MsoPlainText">>    lldb/trunk/source/Core/Module.cpp<o:p></o:p></p>
<p class="MsoPlainText">>    lldb/trunk/source/Core/ModuleList.cpp<o:p></o:p></p>
<p class="MsoPlainText">>    lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp<o:p></o:p></p>
<p class="MsoPlainText">>    lldb/trunk/source/Interpreter/CommandObjectRegexCommand.cpp<o:p></o:p></p>
<p class="MsoPlainText">>    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp<o:p></o:p></p>
<p class="MsoPlainText">>    lldb/trunk/source/Symbol/SymbolContext.cpp<o:p></o:p></p>
<p class="MsoPlainText">>    lldb/trunk/source/Symbol/Symtab.cpp<o:p></o:p></p>
<p class="MsoPlainText">>    lldb/trunk/source/Target/CPPLanguageRuntime.cpp<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Modified: lldb/trunk/include/lldb/Breakpoint/BreakpointResolverName.h<o:p></o:p></p>
<p class="MsoPlainText">> URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Breakpoint/BreakpointResolverName.h?rev=178608&r1=178607&r2=178608&view=diff">
<span style="color:windowtext;text-decoration:none">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Breakpoint/BreakpointResolverName.h?rev=178608&r1=178607&r2=178608&view=diff</span></a><o:p></o:p></p>
<p class="MsoPlainText">> ==============================================================================<o:p></o:p></p>
<p class="MsoPlainText">> --- lldb/trunk/include/lldb/Breakpoint/BreakpointResolverName.h (original)<o:p></o:p></p>
<p class="MsoPlainText">> +++ lldb/trunk/include/lldb/Breakpoint/BreakpointResolverName.h Tue Apr  2 21:00:15 2013<o:p></o:p></p>
<p class="MsoPlainText">> @@ -86,13 +86,33 @@ public:<o:p></o:p></p>
<p class="MsoPlainText">>     }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> protected:<o:p></o:p></p>
<p class="MsoPlainText">> -    std::vector<ConstString> m_func_names;<o:p></o:p></p>
<p class="MsoPlainText">> -    uint32_t m_func_name_type_mask;  // See FunctionNameType<o:p></o:p></p>
<p class="MsoPlainText">> -    ConstString m_class_name;  // FIXME: Not used yet.  The idea would be to stop on methods of this class.<o:p></o:p></p>
<p class="MsoPlainText">> +    struct LookupInfo<o:p></o:p></p>
<p class="MsoPlainText">> +    {<o:p></o:p></p>
<p class="MsoPlainText">> +        ConstString name;<o:p></o:p></p>
<p class="MsoPlainText">> +        ConstString lookup_name;<o:p></o:p></p>
<p class="MsoPlainText">> +        uint32_t name_type_mask; // See FunctionNameType<o:p></o:p></p>
<p class="MsoPlainText">> +        bool match_name_after_lookup;<o:p></o:p></p>
<p class="MsoPlainText">> +        <o:p></o:p></p>
<p class="MsoPlainText">> +        LookupInfo () :<o:p></o:p></p>
<p class="MsoPlainText">> +            name(),<o:p></o:p></p>
<p class="MsoPlainText">> +            lookup_name(),<o:p></o:p></p>
<p class="MsoPlainText">> +            name_type_mask (0),<o:p></o:p></p>
<p class="MsoPlainText">> +            match_name_after_lookup (false)<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +        <o:p></o:p></p>
<p class="MsoPlainText">> +        void<o:p></o:p></p>
<p class="MsoPlainText">> +        Prune (SymbolContextList &sc_list,<o:p></o:p></p>
<p class="MsoPlainText">> +               size_t start_idx) const;<o:p></o:p></p>
<p class="MsoPlainText">> +    };<o:p></o:p></p>
<p class="MsoPlainText">> +    std::vector<LookupInfo> m_lookups;<o:p></o:p></p>
<p class="MsoPlainText">> +    ConstString m_class_name;<o:p></o:p></p>
<p class="MsoPlainText">>     RegularExpression m_regex;<o:p></o:p></p>
<p class="MsoPlainText">>     Breakpoint::MatchType m_match_type;<o:p></o:p></p>
<p class="MsoPlainText">>     bool m_skip_prologue;<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> +    void<o:p></o:p></p>
<p class="MsoPlainText">> +    AddNameLookup (const ConstString &name, uint32_t name_type_mask);<o:p></o:p></p>
<p class="MsoPlainText">> private:<o:p></o:p></p>
<p class="MsoPlainText">>     DISALLOW_COPY_AND_ASSIGN(BreakpointResolverName);<o:p></o:p></p>
<p class="MsoPlainText">> };<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Modified: lldb/trunk/include/lldb/Core/Module.h<o:p></o:p></p>
<p class="MsoPlainText">> URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Module.h?rev=178608&r1=178607&r2=178608&view=diff">
<span style="color:windowtext;text-decoration:none">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Module.h?rev=178608&r1=178607&r2=178608&view=diff</span></a><o:p></o:p></p>
<p class="MsoPlainText">> ==============================================================================<o:p></o:p></p>
<p class="MsoPlainText">> --- lldb/trunk/include/lldb/Core/Module.h (original)<o:p></o:p></p>
<p class="MsoPlainText">> +++ lldb/trunk/include/lldb/Core/Module.h Tue Apr  2 21:00:15 2013<o:p></o:p></p>
<p class="MsoPlainText">> @@ -882,6 +882,56 @@ public:<o:p></o:p></p>
<p class="MsoPlainText">>     bool<o:p></o:p></p>
<p class="MsoPlainText">>     RemapSourceFile (const char *path, std::string &new_path) const;<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> +    <o:p></o:p></p>
<p class="MsoPlainText">> +    //------------------------------------------------------------------<o:p></o:p></p>
<p class="MsoPlainText">> +    /// Prepare to do a function name lookup.<o:p></o:p></p>
<p class="MsoPlainText">> +    ///<o:p></o:p></p>
<p class="MsoPlainText">> +    /// Looking up functions by name can be a tricky thing. LLDB requires<o:p></o:p></p>
<p class="MsoPlainText">> +    /// that accelerator tables contain full names for functions as well<o:p></o:p></p>
<p class="MsoPlainText">> +    /// as function basenames which include functions, class methods and<o:p></o:p></p>
<p class="MsoPlainText">> +    /// class functions. When the user requests that an action use a<o:p></o:p></p>
<p class="MsoPlainText">> +    /// function by name, we are sometimes asked to automatically figure<o:p></o:p></p>
<p class="MsoPlainText">> +    /// out what a name could possibly map to. A user might request a<o:p></o:p></p>
<p class="MsoPlainText">> +    /// breakpoint be set on "count". If no options are supplied to limit<o:p></o:p></p>
<p class="MsoPlainText">> +    /// the scope of where to search for count, we will by default match<o:p></o:p></p>
<p class="MsoPlainText">> +    /// any function names named "count", all class and instance methods<o:p></o:p></p>
<p class="MsoPlainText">> +    /// named "count" (no matter what the namespace or contained context)<o:p></o:p></p>
<p class="MsoPlainText">> +    /// and any selectors named "count". If a user specifies "a::b" we<o:p></o:p></p>
<p class="MsoPlainText">> +    /// will search for the basename "b", and then prune the results that<o:p></o:p></p>
<p class="MsoPlainText">> +    /// don't match "a::b" (note that "c::a::b" and "d::e::a::b" will<o:p></o:p></p>
<p class="MsoPlainText">> +    /// match a query of "a::b".<o:p></o:p></p>
<p class="MsoPlainText">> +    ///<o:p></o:p></p>
<p class="MsoPlainText">> +    /// @param[in] name<o:p></o:p></p>
<p class="MsoPlainText">> +    ///     The user supplied name to use in the lookup<o:p></o:p></p>
<p class="MsoPlainText">> +    ///<o:p></o:p></p>
<p class="MsoPlainText">> +    /// @param[in] name_type_mask<o:p></o:p></p>
<p class="MsoPlainText">> +    ///     The mask of bits from lldb::FunctionNameType enumerations<o:p></o:p></p>
<p class="MsoPlainText">> +    ///     that tell us what kind of name we are looking for.<o:p></o:p></p>
<p class="MsoPlainText">> +    ///<o:p></o:p></p>
<p class="MsoPlainText">> +    /// @param[out] lookup_name<o:p></o:p></p>
<p class="MsoPlainText">> +    ///     The actual name that will be used when calling<o:p></o:p></p>
<p class="MsoPlainText">> +    ///     SymbolVendor::FindFunctions() or Symtab::FindFunctionSymbols()<o:p></o:p></p>
<p class="MsoPlainText">> +    ///<o:p></o:p></p>
<p class="MsoPlainText">> +    /// @param[out] lookup_name_type_mask<o:p></o:p></p>
<p class="MsoPlainText">> +    ///     The actual name mask that should be used in the calls to<o:p></o:p></p>
<p class="MsoPlainText">> +    ///     SymbolVendor::FindFunctions() or Symtab::FindFunctionSymbols()<o:p></o:p></p>
<p class="MsoPlainText">> +    ///<o:p></o:p></p>
<p class="MsoPlainText">> +    /// @param[out] match_name_after_lookup<o:p></o:p></p>
<p class="MsoPlainText">> +    ///     A boolean that indicates if we need to iterate through any<o:p></o:p></p>
<p class="MsoPlainText">> +    ///     match results obtained from SymbolVendor::FindFunctions() or<o:p></o:p></p>
<p class="MsoPlainText">> +    ///     Symtab::FindFunctionSymbols() to see if the name contains<o:p></o:p></p>
<p class="MsoPlainText">> +    ///     \a name. For example if \a name is "a::b", this function will<o:p></o:p></p>
<p class="MsoPlainText">> +    ///     return a \a lookup_name of "b", with \a match_name_after_lookup<o:p></o:p></p>
<p class="MsoPlainText">> +    ///     set to true to indicate any matches will need to be checked<o:p></o:p></p>
<p class="MsoPlainText">> +    ///     to make sure they contain \a name.<o:p></o:p></p>
<p class="MsoPlainText">> +    //------------------------------------------------------------------<o:p></o:p></p>
<p class="MsoPlainText">> +    static void<o:p></o:p></p>
<p class="MsoPlainText">> +    PrepareForFunctionNameLookup (const ConstString &name,<o:p></o:p></p>
<p class="MsoPlainText">> +                                  uint32_t name_type_mask,<o:p></o:p></p>
<p class="MsoPlainText">> +                                  ConstString &lookup_name,<o:p></o:p></p>
<p class="MsoPlainText">> +                                  uint32_t &lookup_name_type_mask,<o:p></o:p></p>
<p class="MsoPlainText">> +                                  bool &match_name_after_lookup);<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> protected:<o:p></o:p></p>
<p class="MsoPlainText">>     //------------------------------------------------------------------<o:p></o:p></p>
<p class="MsoPlainText">>     // Member Variables<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Modified: lldb/trunk/include/lldb/Symbol/SymbolContext.h<o:p></o:p></p>
<p class="MsoPlainText">> URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/SymbolContext.h?rev=178608&r1=178607&r2=178608&view=diff">
<span style="color:windowtext;text-decoration:none">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/SymbolContext.h?rev=178608&r1=178607&r2=178608&view=diff</span></a><o:p></o:p></p>
<p class="MsoPlainText">> ==============================================================================<o:p></o:p></p>
<p class="MsoPlainText">> --- lldb/trunk/include/lldb/Symbol/SymbolContext.h (original)<o:p></o:p></p>
<p class="MsoPlainText">> +++ lldb/trunk/include/lldb/Symbol/SymbolContext.h Tue Apr  2 21:00:15 2013<o:p></o:p></p>
<p class="MsoPlainText">> @@ -461,6 +461,19 @@ public:<o:p></o:p></p>
<p class="MsoPlainText">>     bool<o:p></o:p></p>
<p class="MsoPlainText">>     GetContextAtIndex(size_t idx, SymbolContext& sc) const;<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> +    //------------------------------------------------------------------<o:p></o:p></p>
<p class="MsoPlainText">> +    /// Get accessor for the last symbol context in the list.<o:p></o:p></p>
<p class="MsoPlainText">> +    ///<o:p></o:p></p>
<p class="MsoPlainText">> +    /// @param[out] sc<o:p></o:p></p>
<p class="MsoPlainText">> +    ///     A reference to the symbol context to fill in.<o:p></o:p></p>
<p class="MsoPlainText">> +    ///<o:p></o:p></p>
<p class="MsoPlainText">> +    /// @return<o:p></o:p></p>
<p class="MsoPlainText">> +    ///     Returns \b true if \a sc was filled in, \b false if the<o:p></o:p></p>
<p class="MsoPlainText">> +    ///     list is empty.<o:p></o:p></p>
<p class="MsoPlainText">> +    //------------------------------------------------------------------<o:p></o:p></p>
<p class="MsoPlainText">> +    bool<o:p></o:p></p>
<p class="MsoPlainText">> +    GetLastContext(SymbolContext& sc) const;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">>     bool<o:p></o:p></p>
<p class="MsoPlainText">>     RemoveContextAtIndex (size_t idx);<o:p></o:p></p>
<p class="MsoPlainText">>     //------------------------------------------------------------------<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Modified: lldb/trunk/include/lldb/Symbol/Symtab.h<o:p></o:p></p>
<p class="MsoPlainText">> URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/Symtab.h?rev=178608&r1=178607&r2=178608&view=diff">
<span style="color:windowtext;text-decoration:none">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/Symtab.h?rev=178608&r1=178607&r2=178608&view=diff</span></a><o:p></o:p></p>
<p class="MsoPlainText">> ==============================================================================<o:p></o:p></p>
<p class="MsoPlainText">> --- lldb/trunk/include/lldb/Symbol/Symtab.h (original)<o:p></o:p></p>
<p class="MsoPlainText">> +++ lldb/trunk/include/lldb/Symbol/Symtab.h Tue Apr  2 21:00:15 2013<o:p></o:p></p>
<p class="MsoPlainText">> @@ -107,6 +107,8 @@ protected:<o:p></o:p></p>
<p class="MsoPlainText">>     collection          m_symbols;<o:p></o:p></p>
<p class="MsoPlainText">>     std::vector<uint32_t> m_addr_indexes;<o:p></o:p></p>
<p class="MsoPlainText">>     UniqueCStringMap<uint32_t> m_name_to_index;<o:p></o:p></p>
<p class="MsoPlainText">> +    UniqueCStringMap<uint32_t> m_basename_to_index;<o:p></o:p></p>
<p class="MsoPlainText">> +    UniqueCStringMap<uint32_t> m_method_to_index;<o:p></o:p></p>
<p class="MsoPlainText">>     UniqueCStringMap<uint32_t> m_selector_to_index;<o:p></o:p></p>
<p class="MsoPlainText">>     mutable Mutex       m_mutex; // Provide thread safety for this symbol table<o:p></o:p></p>
<p class="MsoPlainText">>     bool                m_addr_indexes_computed:1,<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Modified: lldb/trunk/include/lldb/Target/CPPLanguageRuntime.h<o:p></o:p></p>
<p class="MsoPlainText">> URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/CPPLanguageRuntime.h?rev=178608&r1=178607&r2=178608&view=diff">
<span style="color:windowtext;text-decoration:none">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/CPPLanguageRuntime.h?rev=178608&r1=178607&r2=178608&view=diff</span></a><o:p></o:p></p>
<p class="MsoPlainText">> ==============================================================================<o:p></o:p></p>
<p class="MsoPlainText">> --- lldb/trunk/include/lldb/Target/CPPLanguageRuntime.h (original)<o:p></o:p></p>
<p class="MsoPlainText">> +++ lldb/trunk/include/lldb/Target/CPPLanguageRuntime.h Tue Apr  2 21:00:15 2013<o:p></o:p></p>
<p class="MsoPlainText">> @@ -25,6 +25,93 @@ class CPPLanguageRuntime :<o:p></o:p></p>
<p class="MsoPlainText">>     public LanguageRuntime<o:p></o:p></p>
<p class="MsoPlainText">> {<o:p></o:p></p>
<p class="MsoPlainText">> public:<o:p></o:p></p>
<p class="MsoPlainText">> +    <o:p></o:p></p>
<p class="MsoPlainText">> +    class MethodName<o:p></o:p></p>
<p class="MsoPlainText">> +    {<o:p></o:p></p>
<p class="MsoPlainText">> +    public:<o:p></o:p></p>
<p class="MsoPlainText">> +        enum Type<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            eTypeInvalid,<o:p></o:p></p>
<p class="MsoPlainText">> +            eTypeUnknownMethod,<o:p></o:p></p>
<p class="MsoPlainText">> +            eTypeClassMethod,<o:p></o:p></p>
<p class="MsoPlainText">> +            eTypeInstanceMethod<o:p></o:p></p>
<p class="MsoPlainText">> +        };<o:p></o:p></p>
<p class="MsoPlainText">> +        <o:p></o:p></p>
<p class="MsoPlainText">> +        MethodName () :<o:p></o:p></p>
<p class="MsoPlainText">> +            m_full(),<o:p></o:p></p>
<p class="MsoPlainText">> +            m_basename(),<o:p></o:p></p>
<p class="MsoPlainText">> +            m_context(),<o:p></o:p></p>
<p class="MsoPlainText">> +            m_arguments(),<o:p></o:p></p>
<p class="MsoPlainText">> +            m_qualifiers(),<o:p></o:p></p>
<p class="MsoPlainText">> +            m_type (eTypeInvalid),<o:p></o:p></p>
<p class="MsoPlainText">> +            m_parsed (false),<o:p></o:p></p>
<p class="MsoPlainText">> +            m_parse_error (false)<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +        MethodName (const ConstString &s) :<o:p></o:p></p>
<p class="MsoPlainText">> +            m_full(s),<o:p></o:p></p>
<p class="MsoPlainText">> +            m_basename(),<o:p></o:p></p>
<p class="MsoPlainText">> +            m_context(),<o:p></o:p></p>
<p class="MsoPlainText">> +            m_arguments(),<o:p></o:p></p>
<p class="MsoPlainText">> +            m_qualifiers(),<o:p></o:p></p>
<p class="MsoPlainText">> +            m_type (eTypeInvalid),<o:p></o:p></p>
<p class="MsoPlainText">> +            m_parsed (false),<o:p></o:p></p>
<p class="MsoPlainText">> +            m_parse_error (false)<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +        void<o:p></o:p></p>
<p class="MsoPlainText">> +        Clear();<o:p></o:p></p>
<p class="MsoPlainText">> +        <o:p></o:p></p>
<p class="MsoPlainText">> +        bool<o:p></o:p></p>
<p class="MsoPlainText">> +        IsValid () const<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            if (m_parse_error)<o:p></o:p></p>
<p class="MsoPlainText">> +                return false;<o:p></o:p></p>
<p class="MsoPlainText">> +            if (m_type == eTypeInvalid)<o:p></o:p></p>
<p class="MsoPlainText">> +                return false;<o:p></o:p></p>
<p class="MsoPlainText">> +            return (bool)m_full;<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +        Type<o:p></o:p></p>
<p class="MsoPlainText">> +        GetType () const<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            return m_type;<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +        <o:p></o:p></p>
<p class="MsoPlainText">> +        const ConstString &<o:p></o:p></p>
<p class="MsoPlainText">> +        GetFullName () const<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            return m_full;<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +        <o:p></o:p></p>
<p class="MsoPlainText">> +        const ConstString &<o:p></o:p></p>
<p class="MsoPlainText">> +        GetBasename ();<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +        llvm::StringRef<o:p></o:p></p>
<p class="MsoPlainText">> +        GetContext ();<o:p></o:p></p>
<p class="MsoPlainText">> +        <o:p></o:p></p>
<p class="MsoPlainText">> +        llvm::StringRef<o:p></o:p></p>
<p class="MsoPlainText">> +        GetArguments ();<o:p></o:p></p>
<p class="MsoPlainText">> +        <o:p></o:p></p>
<p class="MsoPlainText">> +        llvm::StringRef<o:p></o:p></p>
<p class="MsoPlainText">> +        GetQualifiers ();<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +    protected:<o:p></o:p></p>
<p class="MsoPlainText">> +        void<o:p></o:p></p>
<p class="MsoPlainText">> +        Parse();<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +        ConstString     m_full;         // Full name:    "lldb::SBTarget::GetBreakpointAtIndex(unsigned int) const"<o:p></o:p></p>
<p class="MsoPlainText">> +        ConstString     m_basename;     // Basename:     "GetBreakpointAtIndex"<o:p></o:p></p>
<p class="MsoPlainText">> +        llvm::StringRef m_context;      // Decl context: "lldb::SBTarget"<o:p></o:p></p>
<p class="MsoPlainText">> +        llvm::StringRef m_arguments;    // Arguments:    "(unsigned int)"<o:p></o:p></p>
<p class="MsoPlainText">> +        llvm::StringRef m_qualifiers;   // Qualifiers:   "const"<o:p></o:p></p>
<p class="MsoPlainText">> +        Type m_type;<o:p></o:p></p>
<p class="MsoPlainText">> +        bool m_parsed;<o:p></o:p></p>
<p class="MsoPlainText">> +        bool m_parse_error;<o:p></o:p></p>
<p class="MsoPlainText">> +    };<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">>     virtual<o:p></o:p></p>
<p class="MsoPlainText">>     ~CPPLanguageRuntime();<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Modified: lldb/trunk/source/Breakpoint/BreakpointResolverName.cpp<o:p></o:p></p>
<p class="MsoPlainText">> URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Breakpoint/BreakpointResolverName.cpp?rev=178608&r1=178607&r2=178608&view=diff">
<span style="color:windowtext;text-decoration:none">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Breakpoint/BreakpointResolverName.cpp?rev=178608&r1=178607&r2=178608&view=diff</span></a><o:p></o:p></p>
<p class="MsoPlainText">> ==============================================================================<o:p></o:p></p>
<p class="MsoPlainText">> --- lldb/trunk/source/Breakpoint/BreakpointResolverName.cpp (original)<o:p></o:p></p>
<p class="MsoPlainText">> +++ lldb/trunk/source/Breakpoint/BreakpointResolverName.cpp Tue Apr  2 21:00:15 2013<o:p></o:p></p>
<p class="MsoPlainText">> @@ -27,16 +27,12 @@<o:p></o:p></p>
<p class="MsoPlainText">> using namespace lldb;<o:p></o:p></p>
<p class="MsoPlainText">> using namespace lldb_private;<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -BreakpointResolverName::BreakpointResolverName<o:p></o:p></p>
<p class="MsoPlainText">> -(<o:p></o:p></p>
<p class="MsoPlainText">> -    Breakpoint *bkpt,<o:p></o:p></p>
<p class="MsoPlainText">> -    const char *func_name,<o:p></o:p></p>
<p class="MsoPlainText">> -    uint32_t func_name_type_mask,<o:p></o:p></p>
<p class="MsoPlainText">> -    Breakpoint::MatchType type,<o:p></o:p></p>
<p class="MsoPlainText">> -    bool skip_prologue<o:p></o:p></p>
<p class="MsoPlainText">> -) :<o:p></o:p></p>
<p class="MsoPlainText">> +BreakpointResolverName::BreakpointResolverName (Breakpoint *bkpt,<o:p></o:p></p>
<p class="MsoPlainText">> +                                                const char *name_cstr,<o:p></o:p></p>
<p class="MsoPlainText">> +                                                uint32_t name_type_mask,<o:p></o:p></p>
<p class="MsoPlainText">> +                                                Breakpoint::MatchType type,<o:p></o:p></p>
<p class="MsoPlainText">> +                                                bool skip_prologue) :<o:p></o:p></p>
<p class="MsoPlainText">>     BreakpointResolver (bkpt, BreakpointResolver::NameResolver),<o:p></o:p></p>
<p class="MsoPlainText">> -    m_func_name_type_mask (func_name_type_mask),<o:p></o:p></p>
<p class="MsoPlainText">>     m_class_name (),<o:p></o:p></p>
<p class="MsoPlainText">>     m_regex (),<o:p></o:p></p>
<p class="MsoPlainText">>     m_match_type (type),<o:p></o:p></p>
<p class="MsoPlainText">> @@ -45,22 +41,17 @@ BreakpointResolverName::BreakpointResolv<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">>     if (m_match_type == Breakpoint::Regexp)<o:p></o:p></p>
<p class="MsoPlainText">>     {<o:p></o:p></p>
<p class="MsoPlainText">> -        if (!m_regex.Compile (func_name))<o:p></o:p></p>
<p class="MsoPlainText">> +        if (!m_regex.Compile (name_cstr))<o:p></o:p></p>
<p class="MsoPlainText">>         {<o:p></o:p></p>
<p class="MsoPlainText">>             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">>             if (log)<o:p></o:p></p>
<p class="MsoPlainText">> -                log->Warning ("function name regexp: \"%s\" did not compile.", func_name);<o:p></o:p></p>
<p class="MsoPlainText">> +                log->Warning ("function name regexp: \"%s\" did not compile.", name_cstr);<o:p></o:p></p>
<p class="MsoPlainText">>         }<o:p></o:p></p>
<p class="MsoPlainText">>     }<o:p></o:p></p>
<p class="MsoPlainText">>     else<o:p></o:p></p>
<p class="MsoPlainText">>     {<o:p></o:p></p>
<p class="MsoPlainText">> -        const bool append = true;<o:p></o:p></p>
<p class="MsoPlainText">> -        ObjCLanguageRuntime::MethodName objc_name(func_name, false);<o:p></o:p></p>
<p class="MsoPlainText">> -        if (objc_name.IsValid(false))<o:p></o:p></p>
<p class="MsoPlainText">> -            objc_name.GetFullNames(m_func_names, append);<o:p></o:p></p>
<p class="MsoPlainText">> -        else<o:p></o:p></p>
<p class="MsoPlainText">> -            m_func_names.push_back(ConstString(func_name));<o:p></o:p></p>
<p class="MsoPlainText">> +        AddNameLookup (ConstString(name_cstr), name_type_mask);<o:p></o:p></p>
<p class="MsoPlainText">>     }<o:p></o:p></p>
<p class="MsoPlainText">> }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> @@ -70,18 +61,12 @@ BreakpointResolverName::BreakpointResolv<o:p></o:p></p>
<p class="MsoPlainText">>                                                 uint32_t name_type_mask,<o:p></o:p></p>
<p class="MsoPlainText">>                                                 bool skip_prologue) :<o:p></o:p></p>
<p class="MsoPlainText">>     BreakpointResolver (bkpt, BreakpointResolver::NameResolver),<o:p></o:p></p>
<p class="MsoPlainText">> -    m_func_name_type_mask (name_type_mask),<o:p></o:p></p>
<p class="MsoPlainText">>     m_match_type (Breakpoint::Exact),<o:p></o:p></p>
<p class="MsoPlainText">>     m_skip_prologue (skip_prologue)<o:p></o:p></p>
<p class="MsoPlainText">> {<o:p></o:p></p>
<p class="MsoPlainText">> -    const bool append = true;<o:p></o:p></p>
<p class="MsoPlainText">>     for (size_t i = 0; i < num_names; i++)<o:p></o:p></p>
<p class="MsoPlainText">>     {<o:p></o:p></p>
<p class="MsoPlainText">> -        ObjCLanguageRuntime::MethodName objc_name(names[i], false);<o:p></o:p></p>
<p class="MsoPlainText">> -        if (objc_name.IsValid(false))<o:p></o:p></p>
<p class="MsoPlainText">> -            objc_name.GetFullNames(m_func_names, append);<o:p></o:p></p>
<p class="MsoPlainText">> -        else<o:p></o:p></p>
<p class="MsoPlainText">> -            m_func_names.push_back (ConstString (names[i]));<o:p></o:p></p>
<p class="MsoPlainText">> +        AddNameLookup (ConstString (names[i]), name_type_mask);<o:p></o:p></p>
<p class="MsoPlainText">>     }<o:p></o:p></p>
<p class="MsoPlainText">> }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> @@ -90,28 +75,18 @@ BreakpointResolverName::BreakpointResolv<o:p></o:p></p>
<p class="MsoPlainText">>                                                 uint32_t name_type_mask,<o:p></o:p></p>
<p class="MsoPlainText">>                                                 bool skip_prologue) :<o:p></o:p></p>
<p class="MsoPlainText">>     BreakpointResolver (bkpt, BreakpointResolver::NameResolver),<o:p></o:p></p>
<p class="MsoPlainText">> -    m_func_name_type_mask (name_type_mask),<o:p></o:p></p>
<p class="MsoPlainText">>     m_match_type (Breakpoint::Exact),<o:p></o:p></p>
<p class="MsoPlainText">>     m_skip_prologue (skip_prologue)<o:p></o:p></p>
<p class="MsoPlainText">> {<o:p></o:p></p>
<p class="MsoPlainText">> -    size_t num_names = names.size();<o:p></o:p></p>
<p class="MsoPlainText">> -    const bool append = true;    <o:p></o:p></p>
<p class="MsoPlainText">> -    for (size_t i = 0; i < num_names; i++)<o:p></o:p></p>
<p class="MsoPlainText">> +    for (const std::string& name : names)<o:p></o:p></p>
<p class="MsoPlainText">>     {<o:p></o:p></p>
<p class="MsoPlainText">> -        ObjCLanguageRuntime::MethodName objc_name(names[i].c_str(), false);<o:p></o:p></p>
<p class="MsoPlainText">> -        if (objc_name.IsValid(false))<o:p></o:p></p>
<p class="MsoPlainText">> -            objc_name.GetFullNames(m_func_names, append);<o:p></o:p></p>
<p class="MsoPlainText">> -        else<o:p></o:p></p>
<p class="MsoPlainText">> -            m_func_names.push_back (ConstString (names[i].c_str()));<o:p></o:p></p>
<p class="MsoPlainText">> +        AddNameLookup (ConstString (name.c_str(), name.size()), name_type_mask);<o:p></o:p></p>
<p class="MsoPlainText">>     }<o:p></o:p></p>
<p class="MsoPlainText">> }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -BreakpointResolverName::BreakpointResolverName<o:p></o:p></p>
<p class="MsoPlainText">> -(<o:p></o:p></p>
<p class="MsoPlainText">> -    Breakpoint *bkpt,<o:p></o:p></p>
<p class="MsoPlainText">> -    RegularExpression &func_regex,<o:p></o:p></p>
<p class="MsoPlainText">> -    bool skip_prologue<o:p></o:p></p>
<p class="MsoPlainText">> -) :<o:p></o:p></p>
<p class="MsoPlainText">> +BreakpointResolverName::BreakpointResolverName (Breakpoint *bkpt,<o:p></o:p></p>
<p class="MsoPlainText">> +                                                RegularExpression &func_regex,<o:p></o:p></p>
<p class="MsoPlainText">> +                                                bool skip_prologue) :<o:p></o:p></p>
<p class="MsoPlainText">>     BreakpointResolver (bkpt, BreakpointResolver::NameResolver),<o:p></o:p></p>
<p class="MsoPlainText">>     m_class_name (NULL),<o:p></o:p></p>
<p class="MsoPlainText">>     m_regex (func_regex),<o:p></o:p></p>
<p class="MsoPlainText">> @@ -134,13 +109,71 @@ BreakpointResolverName::BreakpointResolv<o:p></o:p></p>
<p class="MsoPlainText">>     m_match_type (type),<o:p></o:p></p>
<p class="MsoPlainText">>     m_skip_prologue (skip_prologue)<o:p></o:p></p>
<p class="MsoPlainText">> {<o:p></o:p></p>
<p class="MsoPlainText">> -    m_func_names.push_back(ConstString(method));<o:p></o:p></p>
<p class="MsoPlainText">> +    LookupInfo lookup;<o:p></o:p></p>
<p class="MsoPlainText">> +    lookup.name.SetCString(method);<o:p></o:p></p>
<p class="MsoPlainText">> +    lookup.lookup_name = lookup.name;<o:p></o:p></p>
<p class="MsoPlainText">> +    lookup.name_type_mask = eFunctionNameTypeMethod;<o:p></o:p></p>
<p class="MsoPlainText">> +    lookup.match_name_after_lookup = false;<o:p></o:p></p>
<p class="MsoPlainText">> +    m_lookups.push_back (lookup);<o:p></o:p></p>
<p class="MsoPlainText">> }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> BreakpointResolverName::~BreakpointResolverName ()<o:p></o:p></p>
<p class="MsoPlainText">> {<o:p></o:p></p>
<p class="MsoPlainText">> }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> +void<o:p></o:p></p>
<p class="MsoPlainText">> +BreakpointResolverName::AddNameLookup (const ConstString &name, uint32_t name_type_mask)<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +    ObjCLanguageRuntime::MethodName objc_method(name.GetCString(), false);<o:p></o:p></p>
<p class="MsoPlainText">> +    if (objc_method.IsValid(false))<o:p></o:p></p>
<p class="MsoPlainText">> +    {<o:p></o:p></p>
<p class="MsoPlainText">> +        std::vector<ConstString> objc_names;<o:p></o:p></p>
<p class="MsoPlainText">> +        objc_method.GetFullNames(objc_names, true);<o:p></o:p></p>
<p class="MsoPlainText">> +        for (ConstString objc_name : objc_names)<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            LookupInfo lookup;<o:p></o:p></p>
<p class="MsoPlainText">> +            lookup.name = name;<o:p></o:p></p>
<p class="MsoPlainText">> +            lookup.lookup_name = objc_name;<o:p></o:p></p>
<p class="MsoPlainText">> +            lookup.name_type_mask = eFunctionNameTypeFull;<o:p></o:p></p>
<p class="MsoPlainText">> +            lookup.match_name_after_lookup = false;<o:p></o:p></p>
<p class="MsoPlainText">> +            m_lookups.push_back (lookup);<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +    }<o:p></o:p></p>
<p class="MsoPlainText">> +    else<o:p></o:p></p>
<p class="MsoPlainText">> +    {<o:p></o:p></p>
<p class="MsoPlainText">> +        LookupInfo lookup;<o:p></o:p></p>
<p class="MsoPlainText">> +        lookup.name = name;<o:p></o:p></p>
<p class="MsoPlainText">> +        Module::PrepareForFunctionNameLookup(lookup.name, name_type_mask, lookup.lookup_name, lookup.name_type_mask, lookup.match_name_after_lookup);<o:p></o:p></p>
<p class="MsoPlainText">> +        m_lookups.push_back (lookup);<o:p></o:p></p>
<p class="MsoPlainText">> +    }<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +void<o:p></o:p></p>
<p class="MsoPlainText">> +BreakpointResolverName::LookupInfo::Prune (SymbolContextList &sc_list, size_t start_idx) const<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +    if (match_name_after_lookup && name)<o:p></o:p></p>
<p class="MsoPlainText">> +    {<o:p></o:p></p>
<p class="MsoPlainText">> +        SymbolContext sc;<o:p></o:p></p>
<p class="MsoPlainText">> +        size_t i = start_idx;<o:p></o:p></p>
<p class="MsoPlainText">> +        while (i < sc_list.GetSize())<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            if (!sc_list.GetContextAtIndex(i, sc))<o:p></o:p></p>
<p class="MsoPlainText">> +                break;<o:p></o:p></p>
<p class="MsoPlainText">> +            ConstString full_name (sc.GetFunctionName());<o:p></o:p></p>
<p class="MsoPlainText">> +            if (full_name && ::strstr(full_name.GetCString(), name.GetCString()) == NULL)<o:p></o:p></p>
<p class="MsoPlainText">> +            {<o:p></o:p></p>
<p class="MsoPlainText">> +                sc_list.RemoveContextAtIndex(i);<o:p></o:p></p>
<p class="MsoPlainText">> +            }<o:p></o:p></p>
<p class="MsoPlainText">> +            else<o:p></o:p></p>
<p class="MsoPlainText">> +            {<o:p></o:p></p>
<p class="MsoPlainText">> +                ++i;<o:p></o:p></p>
<p class="MsoPlainText">> +            }<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +    }<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> // FIXME: Right now we look at the module level, and call the module's "FindFunctions".<o:p></o:p></p>
<p class="MsoPlainText">> // Greg says he will add function tables, maybe at the CompileUnit level to accelerate function<o:p></o:p></p>
<p class="MsoPlainText">> // lookup.  At that point, we should switch the depth to CompileUnit, and look in these tables.<o:p></o:p></p>
<p class="MsoPlainText">> @@ -159,7 +192,6 @@ BreakpointResolverName::SearchCallback<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">>     uint32_t i;<o:p></o:p></p>
<p class="MsoPlainText">>     bool new_location;<o:p></o:p></p>
<p class="MsoPlainText">> -    SymbolContext sc;<o:p></o:p></p>
<p class="MsoPlainText">>     Address break_addr;<o:p></o:p></p>
<p class="MsoPlainText">>     assert (m_breakpoint != NULL);<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> @@ -182,22 +214,29 @@ BreakpointResolverName::SearchCallback<o:p></o:p></p>
<p class="MsoPlainText">>         case Breakpoint::Exact:<o:p></o:p></p>
<p class="MsoPlainText">>             if (context.module_sp)<o:p></o:p></p>
<p class="MsoPlainText">>             {<o:p></o:p></p>
<p class="MsoPlainText">> -                size_t num_names = m_func_names.size();<o:p></o:p></p>
<p class="MsoPlainText">> -                for (int j = 0; j < num_names; j++)<o:p></o:p></p>
<p class="MsoPlainText">> +                for (const LookupInfo &lookup : m_lookups)<o:p></o:p></p>
<p class="MsoPlainText">>                 {<o:p></o:p></p>
<p class="MsoPlainText">> -                    size_t num_functions = context.module_sp->FindFunctions (m_func_names[j],<o:p></o:p></p>
<p class="MsoPlainText">> -                                                                             NULL,<o:p></o:p></p>
<p class="MsoPlainText">> -                                                                             m_func_name_type_mask,<o:p></o:p></p>
<p class="MsoPlainText">> -                                                                             include_symbols,<o:p></o:p></p>
<p class="MsoPlainText">> -                                                                             include_inlines,<o:p></o:p></p>
<p class="MsoPlainText">> -                                                                             append,<o:p></o:p></p>
<p class="MsoPlainText">> -                                                                             func_list);<o:p></o:p></p>
<p class="MsoPlainText">> +                    const size_t start_func_idx = func_list.GetSize();<o:p></o:p></p>
<p class="MsoPlainText">> +                    context.module_sp->FindFunctions (lookup.lookup_name,<o:p></o:p></p>
<p class="MsoPlainText">> +                                                      NULL,<o:p></o:p></p>
<p class="MsoPlainText">> +                                                      lookup.name_type_mask,<o:p></o:p></p>
<p class="MsoPlainText">> +                                                      include_symbols,<o:p></o:p></p>
<p class="MsoPlainText">> +                                                      include_inlines,<o:p></o:p></p>
<p class="MsoPlainText">> +                                                      append,<o:p></o:p></p>
<p class="MsoPlainText">> +                                                      func_list);<o:p></o:p></p>
<p class="MsoPlainText">> +                    const size_t end_func_idx = func_list.GetSize();<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +                    if (start_func_idx < end_func_idx)<o:p></o:p></p>
<p class="MsoPlainText">> +                        lookup.Prune (func_list, start_func_idx);<o:p></o:p></p>
<p class="MsoPlainText">>                     // If the search filter specifies a Compilation Unit, then we don't need to bother to look in plain<o:p></o:p></p>
<p class="MsoPlainText">>                     // symbols, since all the ones from a set compilation unit will have been found above already.<o:p></o:p></p>
<p class="MsoPlainText">> -                    <o:p></o:p></p>
<p class="MsoPlainText">> -                    if (num_functions == 0 && !filter_by_cu)<o:p></o:p></p>
<p class="MsoPlainText">> +                    else if (!filter_by_cu)<o:p></o:p></p>
<p class="MsoPlainText">>                     {<o:p></o:p></p>
<p class="MsoPlainText">> -                        context.module_sp->FindFunctionSymbols (m_func_names[j], m_func_name_type_mask, sym_list);<o:p></o:p></p>
<p class="MsoPlainText">> +                        const size_t start_symbol_idx = sym_list.GetSize();<o:p></o:p></p>
<p class="MsoPlainText">> +                        context.module_sp->FindFunctionSymbols (lookup.lookup_name, lookup.name_type_mask, sym_list);<o:p></o:p></p>
<p class="MsoPlainText">> +                        const size_t end_symbol_idx = sym_list.GetSize();<o:p></o:p></p>
<p class="MsoPlainText">> +                        if (start_symbol_idx < end_symbol_idx)<o:p></o:p></p>
<p class="MsoPlainText">> +                            lookup.Prune (func_list, start_symbol_idx);<o:p></o:p></p>
<p class="MsoPlainText">>                     }<o:p></o:p></p>
<p class="MsoPlainText">>                 }<o:p></o:p></p>
<p class="MsoPlainText">>             }<o:p></o:p></p>
<p class="MsoPlainText">> @@ -239,6 +278,7 @@ BreakpointResolverName::SearchCallback<o:p></o:p></p>
<p class="MsoPlainText">>     }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">>     // Remove any duplicates between the funcion list and the symbol list<o:p></o:p></p>
<p class="MsoPlainText">> +    SymbolContext sc;<o:p></o:p></p>
<p class="MsoPlainText">>     if (func_list.GetSize())<o:p></o:p></p>
<p class="MsoPlainText">>     {<o:p></o:p></p>
<p class="MsoPlainText">>         for (i = 0; i < func_list.GetSize(); i++)<o:p></o:p></p>
<p class="MsoPlainText">> @@ -356,17 +396,17 @@ BreakpointResolverName::GetDescription (<o:p></o:p></p>
<p class="MsoPlainText">>         s->Printf("regex = '%s'", m_regex.GetText());<o:p></o:p></p>
<p class="MsoPlainText">>     else<o:p></o:p></p>
<p class="MsoPlainText">>     {<o:p></o:p></p>
<p class="MsoPlainText">> -        size_t num_names = m_func_names.size();<o:p></o:p></p>
<p class="MsoPlainText">> +        size_t num_names = m_lookups.size();<o:p></o:p></p>
<p class="MsoPlainText">>         if (num_names == 1)<o:p></o:p></p>
<p class="MsoPlainText">> -            s->Printf("name = '%s'", m_func_names[0].AsCString());<o:p></o:p></p>
<p class="MsoPlainText">> +            s->Printf("name = '%s'", m_lookups[0].name.GetCString());<o:p></o:p></p>
<p class="MsoPlainText">>         else<o:p></o:p></p>
<p class="MsoPlainText">>         {<o:p></o:p></p>
<p class="MsoPlainText">>             s->Printf("names = {");<o:p></o:p></p>
<p class="MsoPlainText">>             for (size_t i = 0; i < num_names - 1; i++)<o:p></o:p></p>
<p class="MsoPlainText">>             {<o:p></o:p></p>
<p class="MsoPlainText">> -                s->Printf ("'%s', ", m_func_names[i].AsCString());<o:p></o:p></p>
<p class="MsoPlainText">> +                s->Printf ("'%s', ", m_lookups[i].name.GetCString());<o:p></o:p></p>
<p class="MsoPlainText">>             }<o:p></o:p></p>
<p class="MsoPlainText">> -            s->Printf ("'%s'}", m_func_names[num_names - 1].AsCString());<o:p></o:p></p>
<p class="MsoPlainText">> +            s->Printf ("'%s'}", m_lookups[num_names - 1].name.GetCString());<o:p></o:p></p>
<p class="MsoPlainText">>         }<o:p></o:p></p>
<p class="MsoPlainText">>     }<o:p></o:p></p>
<p class="MsoPlainText">> }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Modified: lldb/trunk/source/Core/Module.cpp<o:p></o:p></p>
<p class="MsoPlainText">> URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Module.cpp?rev=178608&r1=178607&r2=178608&view=diff">
<span style="color:windowtext;text-decoration:none">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Module.cpp?rev=178608&r1=178607&r2=178608&view=diff</span></a><o:p></o:p></p>
<p class="MsoPlainText">> ==============================================================================<o:p></o:p></p>
<p class="MsoPlainText">> --- lldb/trunk/source/Core/Module.cpp (original)<o:p></o:p></p>
<p class="MsoPlainText">> +++ lldb/trunk/source/Core/Module.cpp Tue Apr  2 21:00:15 2013<o:p></o:p></p>
<p class="MsoPlainText">> @@ -29,6 +29,8 @@<o:p></o:p></p>
<p class="MsoPlainText">> #include "lldb/Symbol/ObjectFile.h"<o:p></o:p></p>
<p class="MsoPlainText">> #include "lldb/Symbol/SymbolContext.h"<o:p></o:p></p>
<p class="MsoPlainText">> #include "lldb/Symbol/SymbolVendor.h"<o:p></o:p></p>
<p class="MsoPlainText">> +#include "lldb/Target/CPPLanguageRuntime.h"<o:p></o:p></p>
<p class="MsoPlainText">> +#include "lldb/Target/ObjCLanguageRuntime.h"<o:p></o:p></p>
<p class="MsoPlainText">> #include "lldb/Target/Process.h"<o:p></o:p></p>
<p class="MsoPlainText">> #include "lldb/Target/Target.h"<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> @@ -589,42 +591,83 @@ Module::FindFunctions (const ConstString<o:p></o:p></p>
<p class="MsoPlainText">>     if (!append)<o:p></o:p></p>
<p class="MsoPlainText">>         sc_list.Clear();<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -    const size_t start_size = sc_list.GetSize();<o:p></o:p></p>
<p class="MsoPlainText">> +    const size_t old_size = sc_list.GetSize();<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">>     // Find all the functions (not symbols, but debug information functions...<o:p></o:p></p>
<p class="MsoPlainText">>     SymbolVendor *symbols = GetSymbolVendor ();<o:p></o:p></p>
<p class="MsoPlainText">> -    if (symbols)<o:p></o:p></p>
<p class="MsoPlainText">> -        symbols->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, append, sc_list);<o:p></o:p></p>
<p class="MsoPlainText">> -<o:p></o:p></p>
<p class="MsoPlainText">> -    // Now check our symbol table for symbols that are code symbols if requested<o:p></o:p></p>
<p class="MsoPlainText">> -    if (include_symbols)<o:p></o:p></p>
<p class="MsoPlainText">> +    <o:p></o:p></p>
<p class="MsoPlainText">> +    if (name_type_mask & eFunctionNameTypeAuto)<o:p></o:p></p>
<p class="MsoPlainText">>     {<o:p></o:p></p>
<p class="MsoPlainText">> -        ObjectFile *objfile = GetObjectFile();<o:p></o:p></p>
<p class="MsoPlainText">> -        if (objfile)<o:p></o:p></p>
<p class="MsoPlainText">> +        ConstString lookup_name;<o:p></o:p></p>
<p class="MsoPlainText">> +        uint32_t lookup_name_type_mask = 0;<o:p></o:p></p>
<p class="MsoPlainText">> +        bool match_name_after_lookup = false;<o:p></o:p></p>
<p class="MsoPlainText">> +        Module::PrepareForFunctionNameLookup (name,<o:p></o:p></p>
<p class="MsoPlainText">> +                                              name_type_mask,<o:p></o:p></p>
<p class="MsoPlainText">> +                                              lookup_name,<o:p></o:p></p>
<p class="MsoPlainText">> +                                              lookup_name_type_mask,<o:p></o:p></p>
<p class="MsoPlainText">> +                                              match_name_after_lookup);<o:p></o:p></p>
<p class="MsoPlainText">> +        <o:p></o:p></p>
<p class="MsoPlainText">> +        if (symbols)<o:p></o:p></p>
<p class="MsoPlainText">> +            symbols->FindFunctions(lookup_name,<o:p></o:p></p>
<p class="MsoPlainText">> +                                   namespace_decl,<o:p></o:p></p>
<p class="MsoPlainText">> +                                   lookup_name_type_mask,<o:p></o:p></p>
<p class="MsoPlainText">> +                                   include_inlines,<o:p></o:p></p>
<p class="MsoPlainText">> +                                   append,<o:p></o:p></p>
<p class="MsoPlainText">> +                                   sc_list);<o:p></o:p></p>
<p class="MsoPlainText">> +        <o:p></o:p></p>
<p class="MsoPlainText">> +        // Now check our symbol table for symbols that are code symbols if requested<o:p></o:p></p>
<p class="MsoPlainText">> +        if (include_symbols)<o:p></o:p></p>
<p class="MsoPlainText">>         {<o:p></o:p></p>
<p class="MsoPlainText">> -            Symtab *symtab = objfile->GetSymtab();<o:p></o:p></p>
<p class="MsoPlainText">> -            if (symtab)<o:p></o:p></p>
<p class="MsoPlainText">> +            ObjectFile *objfile = GetObjectFile();<o:p></o:p></p>
<p class="MsoPlainText">> +            if (objfile)<o:p></o:p></p>
<p class="MsoPlainText">>             {<o:p></o:p></p>
<p class="MsoPlainText">> -                std::vector<uint32_t> symbol_indexes;<o:p></o:p></p>
<p class="MsoPlainText">> -                symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeAny, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);<o:p></o:p></p>
<p class="MsoPlainText">> -                const size_t num_matches = symbol_indexes.size();<o:p></o:p></p>
<p class="MsoPlainText">> -                if (num_matches)<o:p></o:p></p>
<p class="MsoPlainText">> +                Symtab *symtab = objfile->GetSymtab();<o:p></o:p></p>
<p class="MsoPlainText">> +                if (symtab)<o:p></o:p></p>
<p class="MsoPlainText">> +                    symtab->FindFunctionSymbols(lookup_name, lookup_name_type_mask, sc_list);<o:p></o:p></p>
<p class="MsoPlainText">> +            }<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +        if (match_name_after_lookup)<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            SymbolContext sc;<o:p></o:p></p>
<p class="MsoPlainText">> +            size_t i = old_size;<o:p></o:p></p>
<p class="MsoPlainText">> +            while (i<sc_list.GetSize())<o:p></o:p></p>
<p class="MsoPlainText">> +            {<o:p></o:p></p>
<p class="MsoPlainText">> +                if (sc_list.GetContextAtIndex(i, sc))<o:p></o:p></p>
<p class="MsoPlainText">>                 {<o:p></o:p></p>
<p class="MsoPlainText">> -                    const bool merge_symbol_into_function = true;<o:p></o:p></p>
<p class="MsoPlainText">> -                    SymbolContext sc(this);<o:p></o:p></p>
<p class="MsoPlainText">> -                    for (size_t i=0; i<num_matches; i++)<o:p></o:p></p>
<p class="MsoPlainText">> +                    const char *func_name = sc.GetFunctionName().GetCString();<o:p></o:p></p>
<p class="MsoPlainText">> +                    if (func_name && strstr (func_name, name.GetCString()) == NULL)<o:p></o:p></p>
<p class="MsoPlainText">>                     {<o:p></o:p></p>
<p class="MsoPlainText">> -                        sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);<o:p></o:p></p>
<p class="MsoPlainText">> -                        SymbolType sym_type = sc.symbol->GetType();<o:p></o:p></p>
<p class="MsoPlainText">> -                        if (sc.symbol && (sym_type == eSymbolTypeCode ||<o:p></o:p></p>
<p class="MsoPlainText">> -                                          sym_type == eSymbolTypeResolver))<o:p></o:p></p>
<p class="MsoPlainText">> -                            sc_list.AppendIfUnique (sc, merge_symbol_into_function);<o:p></o:p></p>
<p class="MsoPlainText">> +                        // Remove the current context<o:p></o:p></p>
<p class="MsoPlainText">> +                        sc_list.RemoveContextAtIndex(i);<o:p></o:p></p>
<p class="MsoPlainText">> +                        // Don't increment i and continue in the loop<o:p></o:p></p>
<p class="MsoPlainText">> +                        continue;<o:p></o:p></p>
<p class="MsoPlainText">>                     }<o:p></o:p></p>
<p class="MsoPlainText">>                 }<o:p></o:p></p>
<p class="MsoPlainText">> +                ++i;<o:p></o:p></p>
<p class="MsoPlainText">>             }<o:p></o:p></p>
<p class="MsoPlainText">>         }<o:p></o:p></p>
<p class="MsoPlainText">> +        <o:p></o:p></p>
<p class="MsoPlainText">>     }<o:p></o:p></p>
<p class="MsoPlainText">> -    return sc_list.GetSize() - start_size;<o:p></o:p></p>
<p class="MsoPlainText">> +    else<o:p></o:p></p>
<p class="MsoPlainText">> +    {<o:p></o:p></p>
<p class="MsoPlainText">> +        if (symbols)<o:p></o:p></p>
<p class="MsoPlainText">> +            symbols->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, append, sc_list);<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +        // Now check our symbol table for symbols that are code symbols if requested<o:p></o:p></p>
<p class="MsoPlainText">> +        if (include_symbols)<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            ObjectFile *objfile = GetObjectFile();<o:p></o:p></p>
<p class="MsoPlainText">> +            if (objfile)<o:p></o:p></p>
<p class="MsoPlainText">> +            {<o:p></o:p></p>
<p class="MsoPlainText">> +                Symtab *symtab = objfile->GetSymtab();<o:p></o:p></p>
<p class="MsoPlainText">> +                if (symtab)<o:p></o:p></p>
<p class="MsoPlainText">> +                    symtab->FindFunctionSymbols(name, name_type_mask, sc_list);<o:p></o:p></p>
<p class="MsoPlainText">> +            }<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +    }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +    return sc_list.GetSize() - old_size;<o:p></o:p></p>
<p class="MsoPlainText">> }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> size_t<o:p></o:p></p>
<p class="MsoPlainText">> @@ -1347,3 +1390,78 @@ Module::GetVersion (uint32_t *versions,<o:p></o:p></p>
<p class="MsoPlainText">>     }<o:p></o:p></p>
<p class="MsoPlainText">>     return 0;<o:p></o:p></p>
<p class="MsoPlainText">> }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +void<o:p></o:p></p>
<p class="MsoPlainText">> +Module::PrepareForFunctionNameLookup (const ConstString &name,<o:p></o:p></p>
<p class="MsoPlainText">> +                                      uint32_t name_type_mask,<o:p></o:p></p>
<p class="MsoPlainText">> +                                      ConstString &lookup_name,<o:p></o:p></p>
<p class="MsoPlainText">> +                                      uint32_t &lookup_name_type_mask,<o:p></o:p></p>
<p class="MsoPlainText">> +                                      bool &match_name_after_lookup)<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +    const char *name_cstr = name.GetCString();<o:p></o:p></p>
<p class="MsoPlainText">> +    lookup_name_type_mask = eFunctionNameTypeNone;<o:p></o:p></p>
<p class="MsoPlainText">> +    match_name_after_lookup = false;<o:p></o:p></p>
<p class="MsoPlainText">> +    const char *base_name_start = NULL;<o:p></o:p></p>
<p class="MsoPlainText">> +    const char *base_name_end = NULL;<o:p></o:p></p>
<p class="MsoPlainText">> +    <o:p></o:p></p>
<p class="MsoPlainText">> +    if (name_type_mask & eFunctionNameTypeAuto)<o:p></o:p></p>
<p class="MsoPlainText">> +    {<o:p></o:p></p>
<p class="MsoPlainText">> +        if (CPPLanguageRuntime::IsCPPMangledName (name_cstr))<o:p></o:p></p>
<p class="MsoPlainText">> +            lookup_name_type_mask = eFunctionNameTypeFull;<o:p></o:p></p>
<p class="MsoPlainText">> +        else if (ObjCLanguageRuntime::IsPossibleObjCMethodName (name_cstr))<o:p></o:p></p>
<p class="MsoPlainText">> +            lookup_name_type_mask = eFunctionNameTypeFull;<o:p></o:p></p>
<p class="MsoPlainText">> +        else<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            if (ObjCLanguageRuntime::IsPossibleObjCSelector(name_cstr))<o:p></o:p></p>
<p class="MsoPlainText">> +                lookup_name_type_mask |= eFunctionNameTypeSelector;<o:p></o:p></p>
<p class="MsoPlainText">> +            <o:p></o:p></p>
<p class="MsoPlainText">> +            if (CPPLanguageRuntime::IsPossibleCPPCall(name_cstr, base_name_start, base_name_end))<o:p></o:p></p>
<p class="MsoPlainText">> +                lookup_name_type_mask |= (eFunctionNameTypeMethod | eFunctionNameTypeBase);<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +    }<o:p></o:p></p>
<p class="MsoPlainText">> +    else<o:p></o:p></p>
<p class="MsoPlainText">> +    {<o:p></o:p></p>
<p class="MsoPlainText">> +        lookup_name_type_mask = name_type_mask;<o:p></o:p></p>
<p class="MsoPlainText">> +        if (lookup_name_type_mask & eFunctionNameTypeMethod || name_type_mask & eFunctionNameTypeBase)<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            // If they've asked for a CPP method or function name and it can't be that, we don't<o:p></o:p></p>
<p class="MsoPlainText">> +            // even need to search for CPP methods or names.<o:p></o:p></p>
<p class="MsoPlainText">> +            if (!CPPLanguageRuntime::IsPossibleCPPCall(name_cstr, base_name_start, base_name_end))<o:p></o:p></p>
<p class="MsoPlainText">> +            {<o:p></o:p></p>
<p class="MsoPlainText">> +                lookup_name_type_mask &= ~(eFunctionNameTypeMethod | eFunctionNameTypeBase);<o:p></o:p></p>
<p class="MsoPlainText">> +                if (lookup_name_type_mask == eFunctionNameTypeNone)<o:p></o:p></p>
<p class="MsoPlainText">> +                    return;<o:p></o:p></p>
<p class="MsoPlainText">> +            }<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +        <o:p></o:p></p>
<p class="MsoPlainText">> +        if (lookup_name_type_mask & eFunctionNameTypeSelector)<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            if (!ObjCLanguageRuntime::IsPossibleObjCSelector(name_cstr))<o:p></o:p></p>
<p class="MsoPlainText">> +            {<o:p></o:p></p>
<p class="MsoPlainText">> +                lookup_name_type_mask &= ~(eFunctionNameTypeSelector);<o:p></o:p></p>
<p class="MsoPlainText">> +                if (lookup_name_type_mask == eFunctionNameTypeNone)<o:p></o:p></p>
<p class="MsoPlainText">> +                    return;<o:p></o:p></p>
<p class="MsoPlainText">> +            }<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +    }<o:p></o:p></p>
<p class="MsoPlainText">> +    <o:p></o:p></p>
<p class="MsoPlainText">> +    if (base_name_start &&<o:p></o:p></p>
<p class="MsoPlainText">> +        base_name_end &&<o:p></o:p></p>
<p class="MsoPlainText">> +        base_name_start != name_cstr &&<o:p></o:p></p>
<p class="MsoPlainText">> +        base_name_start < base_name_end)<o:p></o:p></p>
<p class="MsoPlainText">> +    {<o:p></o:p></p>
<p class="MsoPlainText">> +        // The name supplied was a partial C++ path like "a::count". In this case we want to do a<o:p></o:p></p>
<p class="MsoPlainText">> +        // lookup on the basename "count" and then make sure any matching results contain "a::count"<o:p></o:p></p>
<p class="MsoPlainText">> +        // so that it would match "b::a::count" and "a::count". This is why we set "match_name_after_lookup"<o:p></o:p></p>
<p class="MsoPlainText">> +        // to true<o:p></o:p></p>
<p class="MsoPlainText">> +        lookup_name.SetCStringWithLength(base_name_start, base_name_end - base_name_start);<o:p></o:p></p>
<p class="MsoPlainText">> +        match_name_after_lookup = true;<o:p></o:p></p>
<p class="MsoPlainText">> +    }<o:p></o:p></p>
<p class="MsoPlainText">> +    else<o:p></o:p></p>
<p class="MsoPlainText">> +    {<o:p></o:p></p>
<p class="MsoPlainText">> +        // The name is already correct, just use the exact name as supplied, and we won't need<o:p></o:p></p>
<p class="MsoPlainText">> +        // to check if any matches contain "name"<o:p></o:p></p>
<p class="MsoPlainText">> +        lookup_name = name;<o:p></o:p></p>
<p class="MsoPlainText">> +        match_name_after_lookup = false;<o:p></o:p></p>
<p class="MsoPlainText">> +    }<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> \ No newline at end of file<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Modified: lldb/trunk/source/Core/ModuleList.cpp<o:p></o:p></p>
<p class="MsoPlainText">> URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ModuleList.cpp?rev=178608&r1=178607&r2=178608&view=diff">
<span style="color:windowtext;text-decoration:none">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ModuleList.cpp?rev=178608&r1=178607&r2=178608&view=diff</span></a><o:p></o:p></p>
<p class="MsoPlainText">> ==============================================================================<o:p></o:p></p>
<p class="MsoPlainText">> --- lldb/trunk/source/Core/ModuleList.cpp (original)<o:p></o:p></p>
<p class="MsoPlainText">> +++ lldb/trunk/source/Core/ModuleList.cpp Tue Apr  2 21:00:15 2013<o:p></o:p></p>
<p class="MsoPlainText">> @@ -337,14 +337,64 @@ ModuleList::FindFunctions (const ConstSt<o:p></o:p></p>
<p class="MsoPlainText">>     if (!append)<o:p></o:p></p>
<p class="MsoPlainText">>         sc_list.Clear();<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -    Mutex::Locker locker(m_modules_mutex);<o:p></o:p></p>
<p class="MsoPlainText">> -    collection::const_iterator pos, end = m_modules.end();<o:p></o:p></p>
<p class="MsoPlainText">> -    for (pos = m_modules.begin(); pos != end; ++pos)<o:p></o:p></p>
<p class="MsoPlainText">> +    const size_t old_size = sc_list.GetSize();<o:p></o:p></p>
<p class="MsoPlainText">> +    <o:p></o:p></p>
<p class="MsoPlainText">> +    if (name_type_mask & eFunctionNameTypeAuto)<o:p></o:p></p>
<p class="MsoPlainText">>     {<o:p></o:p></p>
<p class="MsoPlainText">> -        (*pos)->FindFunctions (name, NULL, name_type_mask, include_symbols, include_inlines, true, sc_list);<o:p></o:p></p>
<p class="MsoPlainText">> +        ConstString lookup_name;<o:p></o:p></p>
<p class="MsoPlainText">> +        uint32_t lookup_name_type_mask = 0;<o:p></o:p></p>
<p class="MsoPlainText">> +        bool match_name_after_lookup = false;<o:p></o:p></p>
<p class="MsoPlainText">> +        Module::PrepareForFunctionNameLookup (name, name_type_mask,<o:p></o:p></p>
<p class="MsoPlainText">> +                                              lookup_name,<o:p></o:p></p>
<p class="MsoPlainText">> +                                              lookup_name_type_mask,<o:p></o:p></p>
<p class="MsoPlainText">> +                                              match_name_after_lookup);<o:p></o:p></p>
<p class="MsoPlainText">> +    <o:p></o:p></p>
<p class="MsoPlainText">> +        Mutex::Locker locker(m_modules_mutex);<o:p></o:p></p>
<p class="MsoPlainText">> +        collection::const_iterator pos, end = m_modules.end();<o:p></o:p></p>
<p class="MsoPlainText">> +        for (pos = m_modules.begin(); pos != end; ++pos)<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            (*pos)->FindFunctions (lookup_name,<o:p></o:p></p>
<p class="MsoPlainText">> +                                   NULL,<o:p></o:p></p>
<p class="MsoPlainText">> +                                   lookup_name_type_mask,<o:p></o:p></p>
<p class="MsoPlainText">> +                                   include_symbols,<o:p></o:p></p>
<p class="MsoPlainText">> +                                   include_inlines,<o:p></o:p></p>
<p class="MsoPlainText">> +                                   true,<o:p></o:p></p>
<p class="MsoPlainText">> +                                   sc_list);<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +        <o:p></o:p></p>
<p class="MsoPlainText">> +        if (match_name_after_lookup)<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            SymbolContext sc;<o:p></o:p></p>
<p class="MsoPlainText">> +            size_t i = old_size;<o:p></o:p></p>
<p class="MsoPlainText">> +            while (i<sc_list.GetSize())<o:p></o:p></p>
<p class="MsoPlainText">> +            {<o:p></o:p></p>
<p class="MsoPlainText">> +                if (sc_list.GetContextAtIndex(i, sc))<o:p></o:p></p>
<p class="MsoPlainText">> +                {<o:p></o:p></p>
<p class="MsoPlainText">> +                    const char *func_name = sc.GetFunctionName().GetCString();<o:p></o:p></p>
<p class="MsoPlainText">> +                    if (func_name && strstr (func_name, name.GetCString()) == NULL)<o:p></o:p></p>
<p class="MsoPlainText">> +                    {<o:p></o:p></p>
<p class="MsoPlainText">> +                        // Remove the current context<o:p></o:p></p>
<p class="MsoPlainText">> +                        sc_list.RemoveContextAtIndex(i);<o:p></o:p></p>
<p class="MsoPlainText">> +                        // Don't increment i and continue in the loop<o:p></o:p></p>
<p class="MsoPlainText">> +                        continue;<o:p></o:p></p>
<p class="MsoPlainText">> +                    }<o:p></o:p></p>
<p class="MsoPlainText">> +                }<o:p></o:p></p>
<p class="MsoPlainText">> +                ++i;<o:p></o:p></p>
<p class="MsoPlainText">> +            }<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">>     }<o:p></o:p></p>
<p class="MsoPlainText">> +    else<o:p></o:p></p>
<p class="MsoPlainText">> +    {<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -    return sc_list.GetSize();<o:p></o:p></p>
<p class="MsoPlainText">> +        Mutex::Locker locker(m_modules_mutex);<o:p></o:p></p>
<p class="MsoPlainText">> +        collection::const_iterator pos, end = m_modules.end();<o:p></o:p></p>
<p class="MsoPlainText">> +        for (pos = m_modules.begin(); pos != end; ++pos)<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            (*pos)->FindFunctions (name, NULL, name_type_mask, include_symbols, include_inlines, true, sc_list);<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +    }<o:p></o:p></p>
<p class="MsoPlainText">> +    return sc_list.GetSize() - old_size;<o:p></o:p></p>
<p class="MsoPlainText">> }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> size_t<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Modified: lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp<o:p></o:p></p>
<p class="MsoPlainText">> URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp?rev=178608&r1=178607&r2=178608&view=diff">
<span style="color:windowtext;text-decoration:none">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp?rev=178608&r1=178607&r2=178608&view=diff</span></a><o:p></o:p></p>
<p class="MsoPlainText">> ==============================================================================<o:p></o:p></p>
<p class="MsoPlainText">> --- lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp (original)<o:p></o:p></p>
<p class="MsoPlainText">> +++ lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp Tue Apr  2 21:00:15 2013<o:p></o:p></p>
<p class="MsoPlainText">> @@ -3116,7 +3116,7 @@ ClangExpressionDeclMap::FindExternalVisi<o:p></o:p></p>
<p class="MsoPlainText">>                 //   instance methods for eFunctionNameTypeBase.<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">>                 target->GetImages().FindFunctions(name,<o:p></o:p></p>
<p class="MsoPlainText">> -                                                  eFunctionNameTypeBase,<o:p></o:p></p>
<p class="MsoPlainText">> +                                                  eFunctionNameTypeFull,<o:p></o:p></p>
<p class="MsoPlainText">>                                                   include_symbols,<o:p></o:p></p>
<p class="MsoPlainText">>                                                   include_inlines,<o:p></o:p></p>
<p class="MsoPlainText">>                                                   append,
<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Modified: lldb/trunk/source/Interpreter/CommandObjectRegexCommand.cpp<o:p></o:p></p>
<p class="MsoPlainText">> URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandObjectRegexCommand.cpp?rev=178608&r1=178607&r2=178608&view=diff">
<span style="color:windowtext;text-decoration:none">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandObjectRegexCommand.cpp?rev=178608&r1=178607&r2=178608&view=diff</span></a><o:p></o:p></p>
<p class="MsoPlainText">> ==============================================================================<o:p></o:p></p>
<p class="MsoPlainText">> --- lldb/trunk/source/Interpreter/CommandObjectRegexCommand.cpp (original)<o:p></o:p></p>
<p class="MsoPlainText">> +++ lldb/trunk/source/Interpreter/CommandObjectRegexCommand.cpp Tue Apr  2 21:00:15 2013<o:p></o:p></p>
<p class="MsoPlainText">> @@ -35,8 +35,8 @@ CommandObjectRegexCommand::CommandObject<o:p></o:p></p>
<p class="MsoPlainText">> ) :<o:p></o:p></p>
<p class="MsoPlainText">>     CommandObjectRaw (interpreter, name, help, syntax),<o:p></o:p></p>
<p class="MsoPlainText">>     m_max_matches (max_matches),<o:p></o:p></p>
<p class="MsoPlainText">> -    m_entries (),<o:p></o:p></p>
<p class="MsoPlainText">> -    m_completion_type_mask (completion_type_mask)<o:p></o:p></p>
<p class="MsoPlainText">> +    m_completion_type_mask (completion_type_mask),<o:p></o:p></p>
<p class="MsoPlainText">> +    m_entries ()<o:p></o:p></p>
<p class="MsoPlainText">> {<o:p></o:p></p>
<p class="MsoPlainText">> }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp<o:p></o:p></p>
<p class="MsoPlainText">> URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp?rev=178608&r1=178607&r2=178608&view=diff">
<span style="color:windowtext;text-decoration:none">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp?rev=178608&r1=178607&r2=178608&view=diff</span></a><o:p></o:p></p>
<p class="MsoPlainText">> ==============================================================================<o:p></o:p></p>
<p class="MsoPlainText">> --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)<o:p></o:p></p>
<p class="MsoPlainText">> +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Tue Apr  2 21:00:15 2013<o:p></o:p></p>
<p class="MsoPlainText">> @@ -3322,6 +3322,9 @@ SymbolFileDWARF::FindFunctions (const Co<o:p></o:p></p>
<p class="MsoPlainText">>                         "SymbolFileDWARF::FindFunctions (name = '%s')",<o:p></o:p></p>
<p class="MsoPlainText">>                         name.AsCString());<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> +    // eFunctionNameTypeAuto should be pre-resolved by a call to Module::PrepareForFunctionNameLookup()<o:p></o:p></p>
<p class="MsoPlainText">> +    assert ((name_type_mask & eFunctionNameTypeAuto) == 0);<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">>     Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS));<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">>     if (log)<o:p></o:p></p>
<p class="MsoPlainText">> @@ -3347,59 +3350,16 @@ SymbolFileDWARF::FindFunctions (const Co<o:p></o:p></p>
<p class="MsoPlainText">>     // Remember how many sc_list are in the list before we search in case<o:p></o:p></p>
<p class="MsoPlainText">>     // we are appending the results to a variable list.<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -    const uint32_t original_size = sc_list.GetSize();<o:p></o:p></p>
<p class="MsoPlainText">> -<o:p></o:p></p>
<p class="MsoPlainText">>     const char *name_cstr = name.GetCString();<o:p></o:p></p>
<p class="MsoPlainText">> -    uint32_t effective_name_type_mask = eFunctionNameTypeNone;<o:p></o:p></p>
<p class="MsoPlainText">> -    const char *base_name_start = name_cstr;<o:p></o:p></p>
<p class="MsoPlainText">> -    const char *base_name_end = name_cstr + strlen(name_cstr);<o:p></o:p></p>
<p class="MsoPlainText">> -    <o:p></o:p></p>
<p class="MsoPlainText">> -    if (name_type_mask & eFunctionNameTypeAuto)<o:p></o:p></p>
<p class="MsoPlainText">> -    {<o:p></o:p></p>
<p class="MsoPlainText">> -        if (CPPLanguageRuntime::IsCPPMangledName (name_cstr))<o:p></o:p></p>
<p class="MsoPlainText">> -            effective_name_type_mask = eFunctionNameTypeFull;<o:p></o:p></p>
<p class="MsoPlainText">> -        else if (ObjCLanguageRuntime::IsPossibleObjCMethodName (name_cstr))<o:p></o:p></p>
<p class="MsoPlainText">> -            effective_name_type_mask = eFunctionNameTypeFull;<o:p></o:p></p>
<p class="MsoPlainText">> -        else<o:p></o:p></p>
<p class="MsoPlainText">> -        {<o:p></o:p></p>
<p class="MsoPlainText">> -            if (ObjCLanguageRuntime::IsPossibleObjCSelector(name_cstr))<o:p></o:p></p>
<p class="MsoPlainText">> -                effective_name_type_mask |= eFunctionNameTypeSelector;<o:p></o:p></p>
<p class="MsoPlainText">> -                <o:p></o:p></p>
<p class="MsoPlainText">> -            if (CPPLanguageRuntime::IsPossibleCPPCall(name_cstr, base_name_start, base_name_end))<o:p></o:p></p>
<p class="MsoPlainText">> -                effective_name_type_mask |= (eFunctionNameTypeMethod | eFunctionNameTypeBase);<o:p></o:p></p>
<p class="MsoPlainText">> -        }<o:p></o:p></p>
<p class="MsoPlainText">> -    }<o:p></o:p></p>
<p class="MsoPlainText">> -    else<o:p></o:p></p>
<p class="MsoPlainText">> -    {<o:p></o:p></p>
<p class="MsoPlainText">> -        effective_name_type_mask = name_type_mask;<o:p></o:p></p>
<p class="MsoPlainText">> -        if (effective_name_type_mask & eFunctionNameTypeMethod || name_type_mask & eFunctionNameTypeBase)<o:p></o:p></p>
<p class="MsoPlainText">> -        {<o:p></o:p></p>
<p class="MsoPlainText">> -            // If they've asked for a CPP method or function name and it can't be that, we don't<o:p></o:p></p>
<p class="MsoPlainText">> -            // even need to search for CPP methods or names.<o:p></o:p></p>
<p class="MsoPlainText">> -            if (!CPPLanguageRuntime::IsPossibleCPPCall(name_cstr, base_name_start, base_name_end))<o:p></o:p></p>
<p class="MsoPlainText">> -            {<o:p></o:p></p>
<p class="MsoPlainText">> -                effective_name_type_mask &= ~(eFunctionNameTypeMethod | eFunctionNameTypeBase);<o:p></o:p></p>
<p class="MsoPlainText">> -                if (effective_name_type_mask == eFunctionNameTypeNone)<o:p></o:p></p>
<p class="MsoPlainText">> -                    return 0;<o:p></o:p></p>
<p class="MsoPlainText">> -            }<o:p></o:p></p>
<p class="MsoPlainText">> -        }<o:p></o:p></p>
<p class="MsoPlainText">> -        <o:p></o:p></p>
<p class="MsoPlainText">> -        if (effective_name_type_mask & eFunctionNameTypeSelector)<o:p></o:p></p>
<p class="MsoPlainText">> -        {<o:p></o:p></p>
<p class="MsoPlainText">> -            if (!ObjCLanguageRuntime::IsPossibleObjCSelector(name_cstr))<o:p></o:p></p>
<p class="MsoPlainText">> -            {<o:p></o:p></p>
<p class="MsoPlainText">> -                effective_name_type_mask &= ~(eFunctionNameTypeSelector);<o:p></o:p></p>
<p class="MsoPlainText">> -                if (effective_name_type_mask == eFunctionNameTypeNone)<o:p></o:p></p>
<p class="MsoPlainText">> -                    return 0;<o:p></o:p></p>
<p class="MsoPlainText">> -            }<o:p></o:p></p>
<p class="MsoPlainText">> -        }<o:p></o:p></p>
<p class="MsoPlainText">> -    }<o:p></o:p></p>
<p class="MsoPlainText">> -    <o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +    const uint32_t original_size = sc_list.GetSize();<o:p></o:p></p>
<p class="MsoPlainText">> +   <o:p></o:p></p>
<p class="MsoPlainText">>     DWARFDebugInfo* info = DebugInfo();<o:p></o:p></p>
<p class="MsoPlainText">>     if (info == NULL)<o:p></o:p></p>
<p class="MsoPlainText">>         return 0;<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">>     DWARFCompileUnit *dwarf_cu = NULL;<o:p></o:p></p>
<p class="MsoPlainText">> +    std::set<const DWARFDebugInfoEntry *> resolved_dies;<o:p></o:p></p>
<p class="MsoPlainText">>     if (m_using_apple_tables)<o:p></o:p></p>
<p class="MsoPlainText">>     {<o:p></o:p></p>
<p class="MsoPlainText">>         if (m_apple_names_ap.get())<o:p></o:p></p>
<p class="MsoPlainText">> @@ -3409,7 +3369,7 @@ SymbolFileDWARF::FindFunctions (const Co<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">>             uint32_t num_matches = 0;<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -            if (effective_name_type_mask & eFunctionNameTypeFull)<o:p></o:p></p>
<p class="MsoPlainText">> +            if (name_type_mask & eFunctionNameTypeFull)<o:p></o:p></p>
<p class="MsoPlainText">>             {<o:p></o:p></p>
<p class="MsoPlainText">>                 // If they asked for the full name, match what they typed.  At some point we may<o:p></o:p></p>
<p class="MsoPlainText">>                 // want to canonicalize this (strip double spaces, etc.  For now, we just add all the<o:p></o:p></p>
<p class="MsoPlainText">> @@ -3427,7 +3387,11 @@ SymbolFileDWARF::FindFunctions (const Co<o:p></o:p></p>
<p class="MsoPlainText">>                         if (!include_inlines && die->Tag() == DW_TAG_inlined_subroutine)<o:p></o:p></p>
<p class="MsoPlainText">>                             continue;<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -                        ResolveFunction (dwarf_cu, die, sc_list);<o:p></o:p></p>
<p class="MsoPlainText">> +                        if (resolved_dies.find(die) == resolved_dies.end())<o:p></o:p></p>
<p class="MsoPlainText">> +                        {<o:p></o:p></p>
<p class="MsoPlainText">> +                            if (ResolveFunction (dwarf_cu, die, sc_list))<o:p></o:p></p>
<p class="MsoPlainText">> +                                resolved_dies.insert(die);<o:p></o:p></p>
<p class="MsoPlainText">> +                        }<o:p></o:p></p>
<p class="MsoPlainText">>                     }<o:p></o:p></p>
<p class="MsoPlainText">>                     else<o:p></o:p></p>
<p class="MsoPlainText">>                     {<o:p></o:p></p>
<p class="MsoPlainText">> @@ -3436,87 +3400,116 @@ SymbolFileDWARF::FindFunctions (const Co<o:p></o:p></p>
<p class="MsoPlainText">>                     }                                    <o:p></o:p></p>
<p class="MsoPlainText">>                 }<o:p></o:p></p>
<p class="MsoPlainText">>             }<o:p></o:p></p>
<p class="MsoPlainText">> -            else<o:p></o:p></p>
<p class="MsoPlainText">> -            {                <o:p></o:p></p>
<p class="MsoPlainText">> -                if (effective_name_type_mask & eFunctionNameTypeSelector)<o:p></o:p></p>
<p class="MsoPlainText">> -                {<o:p></o:p></p>
<p class="MsoPlainText">> -                    if (namespace_decl && *namespace_decl)<o:p></o:p></p>
<p class="MsoPlainText">> -                        return 0; // no selectors in namespaces<o:p></o:p></p>
<p class="MsoPlainText">> -                        <o:p></o:p></p>
<p class="MsoPlainText">> -                    num_matches = m_apple_names_ap->FindByName (name_cstr, die_offsets);<o:p></o:p></p>
<p class="MsoPlainText">> -                    // Now make sure these are actually ObjC methods.  In this case we can simply look up the name,<o:p></o:p></p>
<p class="MsoPlainText">> -                    // and if it is an ObjC method name, we're good.<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +            if (name_type_mask & eFunctionNameTypeSelector)<o:p></o:p></p>
<p class="MsoPlainText">> +            {<o:p></o:p></p>
<p class="MsoPlainText">> +                if (namespace_decl && *namespace_decl)<o:p></o:p></p>
<p class="MsoPlainText">> +                    return 0; // no selectors in namespaces<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -                    for (uint32_t i = 0; i < num_matches; i++)<o:p></o:p></p>
<p class="MsoPlainText">> +                num_matches = m_apple_names_ap->FindByName (name_cstr, die_offsets);<o:p></o:p></p>
<p class="MsoPlainText">> +                // Now make sure these are actually ObjC methods.  In this case we can simply look up the name,<o:p></o:p></p>
<p class="MsoPlainText">> +                // and if it is an ObjC method name, we're good.<o:p></o:p></p>
<p class="MsoPlainText">> +                <o:p></o:p></p>
<p class="MsoPlainText">> +                for (uint32_t i = 0; i < num_matches; i++)<o:p></o:p></p>
<p class="MsoPlainText">> +                {<o:p></o:p></p>
<p class="MsoPlainText">> +                    const dw_offset_t die_offset = die_offsets[i];<o:p></o:p></p>
<p class="MsoPlainText">> +                    const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);<o:p></o:p></p>
<p class="MsoPlainText">> +                    if (die)<o:p></o:p></p>
<p class="MsoPlainText">>                     {<o:p></o:p></p>
<p class="MsoPlainText">> -                        const dw_offset_t die_offset = die_offsets[i];<o:p></o:p></p>
<p class="MsoPlainText">> -                        const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);<o:p></o:p></p>
<p class="MsoPlainText">> -                        if (die)<o:p></o:p></p>
<p class="MsoPlainText">> +                        const char *die_name = die->GetName(this, dwarf_cu);<o:p></o:p></p>
<p class="MsoPlainText">> +                        if (ObjCLanguageRuntime::IsPossibleObjCMethodName(die_name))<o:p></o:p></p>
<p class="MsoPlainText">>                         {<o:p></o:p></p>
<p class="MsoPlainText">> -                            const char *die_name = die->GetName(this, dwarf_cu);<o:p></o:p></p>
<p class="MsoPlainText">> -                            if (ObjCLanguageRuntime::IsPossibleObjCMethodName(die_name))<o:p></o:p></p>
<p class="MsoPlainText">> +                            if (!include_inlines && die->Tag() == DW_TAG_inlined_subroutine)<o:p></o:p></p>
<p class="MsoPlainText">> +                                continue;<o:p></o:p></p>
<p class="MsoPlainText">> +                            <o:p></o:p></p>
<p class="MsoPlainText">> +                            if (resolved_dies.find(die) == resolved_dies.end())<o:p></o:p></p>
<p class="MsoPlainText">>                             {<o:p></o:p></p>
<p class="MsoPlainText">> -                                if (!include_inlines && die->Tag() == DW_TAG_inlined_subroutine)<o:p></o:p></p>
<p class="MsoPlainText">> -                                    continue;<o:p></o:p></p>
<p class="MsoPlainText">> -                                <o:p></o:p></p>
<p class="MsoPlainText">> -                                ResolveFunction (dwarf_cu, die, sc_list);<o:p></o:p></p>
<p class="MsoPlainText">> +                                if (ResolveFunction (dwarf_cu, die, sc_list))<o:p></o:p></p>
<p class="MsoPlainText">> +                                    resolved_dies.insert(die);<o:p></o:p></p>
<p class="MsoPlainText">>                             }<o:p></o:p></p>
<p class="MsoPlainText">>                         }<o:p></o:p></p>
<p class="MsoPlainText">> -                        else<o:p></o:p></p>
<p class="MsoPlainText">> -                        {<o:p></o:p></p>
<p class="MsoPlainText">> -                            GetObjectFile()->GetModule()->ReportError ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')",<o:p></o:p></p>
<p class="MsoPlainText">> -                                                                       die_offset, name_cstr);<o:p></o:p></p>
<p class="MsoPlainText">> -                        }                                   
<o:p></o:p></p>
<p class="MsoPlainText">>                     }<o:p></o:p></p>
<p class="MsoPlainText">> -                    die_offsets.clear();<o:p></o:p></p>
<p class="MsoPlainText">> +                    else<o:p></o:p></p>
<p class="MsoPlainText">> +                    {<o:p></o:p></p>
<p class="MsoPlainText">> +                        GetObjectFile()->GetModule()->ReportError ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')",<o:p></o:p></p>
<p class="MsoPlainText">> +                                                                   die_offset, name_cstr);<o:p></o:p></p>
<p class="MsoPlainText">> +                    }                                   
<o:p></o:p></p>
<p class="MsoPlainText">>                 }<o:p></o:p></p>
<p class="MsoPlainText">> +                die_offsets.clear();<o:p></o:p></p>
<p class="MsoPlainText">> +            }<o:p></o:p></p>
<p class="MsoPlainText">> +            <o:p></o:p></p>
<p class="MsoPlainText">> +            if (((name_type_mask & eFunctionNameTypeMethod) && !namespace_decl) || name_type_mask & eFunctionNameTypeBase)<o:p></o:p></p>
<p class="MsoPlainText">> +            {<o:p></o:p></p>
<p class="MsoPlainText">> +                // The apple_names table stores just the "base name" of C++ methods in the table.  So we have to<o:p></o:p></p>
<p class="MsoPlainText">> +                // extract the base name, look that up, and if there is any other information in the name we were<o:p></o:p></p>
<p class="MsoPlainText">> +                // passed in we have to post-filter based on that.<o:p></o:p></p>
<p class="MsoPlainText">> +                <o:p></o:p></p>
<p class="MsoPlainText">> +                // FIXME: Arrange the logic above so that we don't calculate the base name twice:<o:p></o:p></p>
<p class="MsoPlainText">> +                num_matches = m_apple_names_ap->FindByName (name_cstr, die_offsets);<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -                if (effective_name_type_mask & eFunctionNameTypeMethod<o:p></o:p></p>
<p class="MsoPlainText">> -                    || effective_name_type_mask & eFunctionNameTypeBase)<o:p></o:p></p>
<p class="MsoPlainText">> +                for (uint32_t i = 0; i < num_matches; i++)<o:p></o:p></p>
<p class="MsoPlainText">>                 {<o:p></o:p></p>
<p class="MsoPlainText">> -                    if ((effective_name_type_mask & eFunctionNameTypeMethod) &&<o:p></o:p></p>
<p class="MsoPlainText">> -                        (namespace_decl && *namespace_decl))<o:p></o:p></p>
<p class="MsoPlainText">> -                        return 0; // no methods in namespaces<o:p></o:p></p>
<p class="MsoPlainText">> -                    <o:p></o:p></p>
<p class="MsoPlainText">> -                    // The apple_names table stores just the "base name" of C++ methods in the table.  So we have to
<o:p></o:p></p>
<p class="MsoPlainText">> -                    // extract the base name, look that up, and if there is any other information in the name we were<o:p></o:p></p>
<p class="MsoPlainText">> -                    // passed in we have to post-filter based on that.<o:p></o:p></p>
<p class="MsoPlainText">> -                    <o:p></o:p></p>
<p class="MsoPlainText">> -                    // FIXME: Arrange the logic above so that we don't calculate the base name twice:<o:p></o:p></p>
<p class="MsoPlainText">> -                    std::string base_name(base_name_start, base_name_end - base_name_start);<o:p></o:p></p>
<p class="MsoPlainText">> -                    num_matches = m_apple_names_ap->FindByName (base_name.c_str(), die_offsets);<o:p></o:p></p>
<p class="MsoPlainText">> -                    <o:p></o:p></p>
<p class="MsoPlainText">> -                    for (uint32_t i = 0; i < num_matches; i++)<o:p></o:p></p>
<p class="MsoPlainText">> +                    const dw_offset_t die_offset = die_offsets[i];<o:p></o:p></p>
<p class="MsoPlainText">> +                    const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);<o:p></o:p></p>
<p class="MsoPlainText">> +                    if (die)<o:p></o:p></p>
<p class="MsoPlainText">>                     {<o:p></o:p></p>
<p class="MsoPlainText">> -                        const dw_offset_t die_offset = die_offsets[i];<o:p></o:p></p>
<p class="MsoPlainText">> -                        const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu);<o:p></o:p></p>
<p class="MsoPlainText">> -                        if (die)<o:p></o:p></p>
<p class="MsoPlainText">> +                        if (!include_inlines && die->Tag() == DW_TAG_inlined_subroutine)<o:p></o:p></p>
<p class="MsoPlainText">> +                            continue;<o:p></o:p></p>
<p class="MsoPlainText">> +                        <o:p></o:p></p>
<p class="MsoPlainText">> +                        if (namespace_decl && !DIEIsInNamespace (namespace_decl, dwarf_cu, die))<o:p></o:p></p>
<p class="MsoPlainText">> +                            continue;<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +                        // If we get to here, the die is good, and we should add it:<o:p></o:p></p>
<p class="MsoPlainText">> +                        if (resolved_dies.find(die) == resolved_dies.end())<o:p></o:p></p>
<p class="MsoPlainText">> +                        if (ResolveFunction (dwarf_cu, die, sc_list))<o:p></o:p></p>
<p class="MsoPlainText">>                         {<o:p></o:p></p>
<p class="MsoPlainText">> -                            if (!include_inlines && die->Tag() == DW_TAG_inlined_subroutine)<o:p></o:p></p>
<p class="MsoPlainText">> -                                continue;<o:p></o:p></p>
<p class="MsoPlainText">> -                            <o:p></o:p></p>
<p class="MsoPlainText">> -                            if (namespace_decl && !DIEIsInNamespace (namespace_decl, dwarf_cu, die))<o:p></o:p></p>
<p class="MsoPlainText">> -                                continue;<o:p></o:p></p>
<p class="MsoPlainText">> -                            <o:p></o:p></p>
<p class="MsoPlainText">> -                            if (!FunctionDieMatchesPartialName(die,<o:p></o:p></p>
<p class="MsoPlainText">> -                                                               dwarf_cu,
<o:p></o:p></p>
<p class="MsoPlainText">> -                                                               effective_name_type_mask,<o:p></o:p></p>
<p class="MsoPlainText">> -                                                               name_cstr,
<o:p></o:p></p>
<p class="MsoPlainText">> -                                                               base_name_start,
<o:p></o:p></p>
<p class="MsoPlainText">> -                                                               base_name_end))<o:p></o:p></p>
<p class="MsoPlainText">> -                                continue;<o:p></o:p></p>
<p class="MsoPlainText">> -                            <o:p></o:p></p>
<p class="MsoPlainText">> -                            // If we get to here, the die is good, and we should add it:<o:p></o:p></p>
<p class="MsoPlainText">> -                            ResolveFunction (dwarf_cu, die, sc_list);<o:p></o:p></p>
<p class="MsoPlainText">> +                            bool keep_die = true;<o:p></o:p></p>
<p class="MsoPlainText">> +                            if ((name_type_mask & (eFunctionNameTypeBase|eFunctionNameTypeMethod)) != (eFunctionNameTypeBase|eFunctionNameTypeMethod))<o:p></o:p></p>
<p class="MsoPlainText">> +                            {<o:p></o:p></p>
<p class="MsoPlainText">> +                                // We are looking for either basenames or methods, so we need to<o:p></o:p></p>
<p class="MsoPlainText">> +                                // trim out the ones we won't want by looking at the type<o:p></o:p></p>
<p class="MsoPlainText">> +                                SymbolContext sc;<o:p></o:p></p>
<p class="MsoPlainText">> +                                if (sc_list.GetLastContext(sc))<o:p></o:p></p>
<p class="MsoPlainText">> +                                {<o:p></o:p></p>
<p class="MsoPlainText">> +                                    if (sc.block)<o:p></o:p></p>
<p class="MsoPlainText">> +                                    {<o:p></o:p></p>
<p class="MsoPlainText">> +                                        // We have an inlined function<o:p></o:p></p>
<p class="MsoPlainText">> +                                    }<o:p></o:p></p>
<p class="MsoPlainText">> +                                    else if (sc.function)<o:p></o:p></p>
<p class="MsoPlainText">> +                                    {<o:p></o:p></p>
<p class="MsoPlainText">> +                                        Type *type = sc.function->GetType();<o:p></o:p></p>
<p class="MsoPlainText">> +                                        <o:p></o:p></p>
<p class="MsoPlainText">> +                                        clang::DeclContext* decl_ctx = GetClangDeclContextContainingTypeUID (type->GetID());<o:p></o:p></p>
<p class="MsoPlainText">> +                                        if (decl_ctx->isRecord())<o:p></o:p></p>
<p class="MsoPlainText">> +                                        {<o:p></o:p></p>
<p class="MsoPlainText">> +                                            if (name_type_mask & eFunctionNameTypeBase)<o:p></o:p></p>
<p class="MsoPlainText">> +                                            {<o:p></o:p></p>
<p class="MsoPlainText">> +                                                sc_list.RemoveContextAtIndex(sc_list.GetSize()-1);<o:p></o:p></p>
<p class="MsoPlainText">> +                                                keep_die = false;<o:p></o:p></p>
<p class="MsoPlainText">> +                                            }<o:p></o:p></p>
<p class="MsoPlainText">> +                                        }<o:p></o:p></p>
<p class="MsoPlainText">> +                                        else<o:p></o:p></p>
<p class="MsoPlainText">> +                                        {<o:p></o:p></p>
<p class="MsoPlainText">> +                                            if (name_type_mask & eFunctionNameTypeMethod)<o:p></o:p></p>
<p class="MsoPlainText">> +                                            {<o:p></o:p></p>
<p class="MsoPlainText">> +                                                sc_list.RemoveContextAtIndex(sc_list.GetSize()-1);<o:p></o:p></p>
<p class="MsoPlainText">> +                                                keep_die = false;<o:p></o:p></p>
<p class="MsoPlainText">> +                                            }<o:p></o:p></p>
<p class="MsoPlainText">> +                                        }<o:p></o:p></p>
<p class="MsoPlainText">> +                                    }<o:p></o:p></p>
<p class="MsoPlainText">> +                                }<o:p></o:p></p>
<p class="MsoPlainText">> +                            }<o:p></o:p></p>
<p class="MsoPlainText">> +                            if (keep_die)<o:p></o:p></p>
<p class="MsoPlainText">> +                                resolved_dies.insert(die);<o:p></o:p></p>
<p class="MsoPlainText">>                         }<o:p></o:p></p>
<p class="MsoPlainText">> -                        else<o:p></o:p></p>
<p class="MsoPlainText">> -                        {<o:p></o:p></p>
<p class="MsoPlainText">> -                            GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')",<o:p></o:p></p>
<p class="MsoPlainText">> -                                                                                       die_offset, name_cstr);<o:p></o:p></p>
<p class="MsoPlainText">> -                        }                                    <o:p></o:p></p>
<p class="MsoPlainText">>                     }<o:p></o:p></p>
<p class="MsoPlainText">> -                    die_offsets.clear();<o:p></o:p></p>
<p class="MsoPlainText">> +                    else<o:p></o:p></p>
<p class="MsoPlainText">> +                    {<o:p></o:p></p>
<p class="MsoPlainText">> +                        GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_names accelerator table had bad die 0x%8.8x for '%s')",<o:p></o:p></p>
<p class="MsoPlainText">> +                                                                                   die_offset, name_cstr);<o:p></o:p></p>
<p class="MsoPlainText">> +                    }                                   
<o:p></o:p></p>
<p class="MsoPlainText">>                 }<o:p></o:p></p>
<p class="MsoPlainText">> +                die_offsets.clear();<o:p></o:p></p>
<p class="MsoPlainText">>             }<o:p></o:p></p>
<p class="MsoPlainText">>         }<o:p></o:p></p>
<p class="MsoPlainText">>     }<o:p></o:p></p>
<p class="MsoPlainText">> @@ -3530,14 +3523,12 @@ SymbolFileDWARF::FindFunctions (const Co<o:p></o:p></p>
<p class="MsoPlainText">>         if (name_type_mask & eFunctionNameTypeFull)<o:p></o:p></p>
<p class="MsoPlainText">>             FindFunctions (name, m_function_fullname_index, sc_list);<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -        std::string base_name(base_name_start, base_name_end - base_name_start);<o:p></o:p></p>
<p class="MsoPlainText">> -        ConstString base_name_const(base_name.c_str());<o:p></o:p></p>
<p class="MsoPlainText">>         DIEArray die_offsets;<o:p></o:p></p>
<p class="MsoPlainText">>         DWARFCompileUnit *dwarf_cu = NULL;<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -        if (effective_name_type_mask & eFunctionNameTypeBase)<o:p></o:p></p>
<p class="MsoPlainText">> +        if (name_type_mask & eFunctionNameTypeBase)<o:p></o:p></p>
<p class="MsoPlainText">>         {<o:p></o:p></p>
<p class="MsoPlainText">> -            uint32_t num_base = m_function_basename_index.Find(base_name_const, die_offsets);<o:p></o:p></p>
<p class="MsoPlainText">> +            uint32_t num_base = m_function_basename_index.Find(name, die_offsets);<o:p></o:p></p>
<p class="MsoPlainText">>             for (uint32_t i = 0; i < num_base; i++)<o:p></o:p></p>
<p class="MsoPlainText">>             {<o:p></o:p></p>
<p class="MsoPlainText">>                 const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (die_offsets[i], &dwarf_cu);<o:p></o:p></p>
<p class="MsoPlainText">> @@ -3549,27 +3540,23 @@ SymbolFileDWARF::FindFunctions (const Co<o:p></o:p></p>
<p class="MsoPlainText">>                     if (namespace_decl && !DIEIsInNamespace (namespace_decl, dwarf_cu, die))<o:p></o:p></p>
<p class="MsoPlainText">>                         continue;<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -                    if (!FunctionDieMatchesPartialName(die,
<o:p></o:p></p>
<p class="MsoPlainText">> -                                                       dwarf_cu,
<o:p></o:p></p>
<p class="MsoPlainText">> -                                                       eFunctionNameTypeBase,
<o:p></o:p></p>
<p class="MsoPlainText">> -                                                       name_cstr,
<o:p></o:p></p>
<p class="MsoPlainText">> -                                                       base_name_start,
<o:p></o:p></p>
<p class="MsoPlainText">> -                                                       base_name_end))<o:p></o:p></p>
<p class="MsoPlainText">> -                        continue;<o:p></o:p></p>
<p class="MsoPlainText">> -                    <o:p></o:p></p>
<p class="MsoPlainText">>                     // If we get to here, the die is good, and we should add it:<o:p></o:p></p>
<p class="MsoPlainText">> -                    ResolveFunction (dwarf_cu, die, sc_list);<o:p></o:p></p>
<p class="MsoPlainText">> +                    if (resolved_dies.find(die) == resolved_dies.end())<o:p></o:p></p>
<p class="MsoPlainText">> +                    {<o:p></o:p></p>
<p class="MsoPlainText">> +                        if (ResolveFunction (dwarf_cu, die, sc_list))<o:p></o:p></p>
<p class="MsoPlainText">> +                            resolved_dies.insert(die);<o:p></o:p></p>
<p class="MsoPlainText">> +                    }<o:p></o:p></p>
<p class="MsoPlainText">>                 }<o:p></o:p></p>
<p class="MsoPlainText">>             }<o:p></o:p></p>
<p class="MsoPlainText">>             die_offsets.clear();<o:p></o:p></p>
<p class="MsoPlainText">>         }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -        if (effective_name_type_mask & eFunctionNameTypeMethod)<o:p></o:p></p>
<p class="MsoPlainText">> +        if (name_type_mask & eFunctionNameTypeMethod)<o:p></o:p></p>
<p class="MsoPlainText">>         {<o:p></o:p></p>
<p class="MsoPlainText">>             if (namespace_decl && *namespace_decl)<o:p></o:p></p>
<p class="MsoPlainText">>                 return 0; // no methods in namespaces<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -            uint32_t num_base = m_function_method_index.Find(base_name_const, die_offsets);<o:p></o:p></p>
<p class="MsoPlainText">> +            uint32_t num_base = m_function_method_index.Find(name, die_offsets);<o:p></o:p></p>
<p class="MsoPlainText">>             {<o:p></o:p></p>
<p class="MsoPlainText">>                 for (uint32_t i = 0; i < num_base; i++)<o:p></o:p></p>
<p class="MsoPlainText">>                 {<o:p></o:p></p>
<p class="MsoPlainText">> @@ -3579,23 +3566,19 @@ SymbolFileDWARF::FindFunctions (const Co<o:p></o:p></p>
<p class="MsoPlainText">>                         if (!include_inlines && die->Tag() == DW_TAG_inlined_subroutine)<o:p></o:p></p>
<p class="MsoPlainText">>                             continue;<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -                        if (!FunctionDieMatchesPartialName(die,<o:p></o:p></p>
<p class="MsoPlainText">> -                                                           dwarf_cu,
<o:p></o:p></p>
<p class="MsoPlainText">> -                                                           eFunctionNameTypeMethod,
<o:p></o:p></p>
<p class="MsoPlainText">> -                                                           name_cstr,
<o:p></o:p></p>
<p class="MsoPlainText">> -                                                           base_name_start,
<o:p></o:p></p>
<p class="MsoPlainText">> -                                                           base_name_end))<o:p></o:p></p>
<p class="MsoPlainText">> -                            continue;<o:p></o:p></p>
<p class="MsoPlainText">> -                        <o:p></o:p></p>
<p class="MsoPlainText">>                         // If we get to here, the die is good, and we should add it:<o:p></o:p></p>
<p class="MsoPlainText">> -                        ResolveFunction (dwarf_cu, die, sc_list);<o:p></o:p></p>
<p class="MsoPlainText">> +                        if (resolved_dies.find(die) == resolved_dies.end())<o:p></o:p></p>
<p class="MsoPlainText">> +                        {<o:p></o:p></p>
<p class="MsoPlainText">> +                            if (ResolveFunction (dwarf_cu, die, sc_list))<o:p></o:p></p>
<p class="MsoPlainText">> +                                resolved_dies.insert(die);<o:p></o:p></p>
<p class="MsoPlainText">> +                        }<o:p></o:p></p>
<p class="MsoPlainText">>                     }<o:p></o:p></p>
<p class="MsoPlainText">>                 }<o:p></o:p></p>
<p class="MsoPlainText">>             }<o:p></o:p></p>
<p class="MsoPlainText">>             die_offsets.clear();<o:p></o:p></p>
<p class="MsoPlainText">>         }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -        if ((effective_name_type_mask & eFunctionNameTypeSelector) && (!namespace_decl || !*namespace_decl))<o:p></o:p></p>
<p class="MsoPlainText">> +        if ((name_type_mask & eFunctionNameTypeSelector) && (!namespace_decl || !*namespace_decl))<o:p></o:p></p>
<p class="MsoPlainText">>         {<o:p></o:p></p>
<p class="MsoPlainText">>             FindFunctions (name, m_function_selector_index, sc_list);<o:p></o:p></p>
<p class="MsoPlainText">>         }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Modified: lldb/trunk/source/Symbol/SymbolContext.cpp<o:p></o:p></p>
<p class="MsoPlainText">> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/SymbolContext.cpp?rev=178608&r1=178607&r2=178608&view=diff<o:p></o:p></p>
<p class="MsoPlainText">> ==============================================================================<o:p></o:p></p>
<p class="MsoPlainText">> --- lldb/trunk/source/Symbol/SymbolContext.cpp (original)<o:p></o:p></p>
<p class="MsoPlainText">> +++ lldb/trunk/source/Symbol/SymbolContext.cpp Tue Apr  2 21:00:15 2013<o:p></o:p></p>
<p class="MsoPlainText">> @@ -1056,6 +1056,17 @@ SymbolContextList::GetContextAtIndex(siz<o:p></o:p></p>
<p class="MsoPlainText">> }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> bool<o:p></o:p></p>
<p class="MsoPlainText">> +SymbolContextList::GetLastContext(SymbolContext& sc) const<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +    if (!m_symbol_contexts.empty())<o:p></o:p></p>
<p class="MsoPlainText">> +    {<o:p></o:p></p>
<p class="MsoPlainText">> +        sc = m_symbol_contexts.back();<o:p></o:p></p>
<p class="MsoPlainText">> +        return true;<o:p></o:p></p>
<p class="MsoPlainText">> +    }<o:p></o:p></p>
<p class="MsoPlainText">> +    return false;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +bool<o:p></o:p></p>
<p class="MsoPlainText">> SymbolContextList::RemoveContextAtIndex (size_t idx)<o:p></o:p></p>
<p class="MsoPlainText">> {<o:p></o:p></p>
<p class="MsoPlainText">>     if (idx < m_symbol_contexts.size())<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Modified: lldb/trunk/source/Symbol/Symtab.cpp<o:p></o:p></p>
<p class="MsoPlainText">> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Symtab.cpp?rev=178608&r1=178607&r2=178608&view=diff<o:p></o:p></p>
<p class="MsoPlainText">> ==============================================================================<o:p></o:p></p>
<p class="MsoPlainText">> --- lldb/trunk/source/Symbol/Symtab.cpp (original)<o:p></o:p></p>
<p class="MsoPlainText">> +++ lldb/trunk/source/Symbol/Symtab.cpp Tue Apr  2 21:00:15 2013<o:p></o:p></p>
<p class="MsoPlainText">> @@ -16,6 +16,7 @@<o:p></o:p></p>
<p class="MsoPlainText">> #include "lldb/Symbol/ObjectFile.h"<o:p></o:p></p>
<p class="MsoPlainText">> #include "lldb/Symbol/SymbolContext.h"<o:p></o:p></p>
<p class="MsoPlainText">> #include "lldb/Symbol/Symtab.h"<o:p></o:p></p>
<p class="MsoPlainText">> +#include "lldb/Target/CPPLanguageRuntime.h"<o:p></o:p></p>
<p class="MsoPlainText">> #include "lldb/Target/ObjCLanguageRuntime.h"<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> using namespace lldb;<o:p></o:p></p>
<p class="MsoPlainText">> @@ -263,9 +264,9 @@ Symtab::InitNameIndexes()<o:p></o:p></p>
<p class="MsoPlainText">>         m_name_indexes_computed = true;<o:p></o:p></p>
<p class="MsoPlainText">>         Timer scoped_timer (__PRETTY_FUNCTION__, "%s", __PRETTY_FUNCTION__);<o:p></o:p></p>
<p class="MsoPlainText">>         // Create the name index vector to be able to quickly search by name<o:p></o:p></p>
<p class="MsoPlainText">> -        const size_t count = m_symbols.size();<o:p></o:p></p>
<p class="MsoPlainText">> +        const size_t num_symbols = m_symbols.size();<o:p></o:p></p>
<p class="MsoPlainText">> #if 1<o:p></o:p></p>
<p class="MsoPlainText">> -        m_name_to_index.Reserve (count);<o:p></o:p></p>
<p class="MsoPlainText">> +        m_name_to_index.Reserve (num_symbols);<o:p></o:p></p>
<p class="MsoPlainText">> #else<o:p></o:p></p>
<p class="MsoPlainText">>         // TODO: benchmark this to see if we save any memory. Otherwise we<o:p></o:p></p>
<p class="MsoPlainText">>         // will always keep the memory reserved in the vector unless we pull<o:p></o:p></p>
<p class="MsoPlainText">> @@ -288,7 +289,12 @@ Symtab::InitNameIndexes()<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">>         NameToIndexMap::Entry entry;<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -        for (entry.value = 0; entry.value < count; ++entry.value)<o:p></o:p></p>
<p class="MsoPlainText">> +        // The "const char *" in "class_contexts" must come from a ConstString::GetCString()<o:p></o:p></p>
<p class="MsoPlainText">> +        std::set<const char *> class_contexts;<o:p></o:p></p>
<p class="MsoPlainText">> +        UniqueCStringMap<uint32_t> mangled_name_to_index;<o:p></o:p></p>
<p class="MsoPlainText">> +        std::vector<const char *> symbol_contexts(num_symbols, NULL);<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +        for (entry.value = 0; entry.value<num_symbols; ++entry.value)<o:p></o:p></p>
<p class="MsoPlainText">>         {<o:p></o:p></p>
<p class="MsoPlainText">>             const Symbol *symbol = &m_symbols[entry.value];<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> @@ -303,8 +309,66 @@ Symtab::InitNameIndexes()<o:p></o:p></p>
<p class="MsoPlainText">>             const Mangled &mangled = symbol->GetMangled();<o:p></o:p></p>
<p class="MsoPlainText">>             entry.cstring = mangled.GetMangledName().GetCString();<o:p></o:p></p>
<p class="MsoPlainText">>             if (entry.cstring && entry.cstring[0])<o:p></o:p></p>
<p class="MsoPlainText">> +            {<o:p></o:p></p>
<p class="MsoPlainText">>                 m_name_to_index.Append (entry);<o:p></o:p></p>
<p class="MsoPlainText">> -<o:p></o:p></p>
<p class="MsoPlainText">> +                <o:p></o:p></p>
<p class="MsoPlainText">> +                const SymbolType symbol_type = symbol->GetType();<o:p></o:p></p>
<p class="MsoPlainText">> +                if (symbol_type == eSymbolTypeCode || symbol_type == eSymbolTypeResolver)<o:p></o:p></p>
<p class="MsoPlainText">> +                {<o:p></o:p></p>
<p class="MsoPlainText">> +                    if (entry.cstring[0] == '_' && entry.cstring[1] == 'Z' &&<o:p></o:p></p>
<p class="MsoPlainText">> +                        (entry.cstring[2] != 'T' && // avoid virtual table, VTT structure, typeinfo structure, and typeinfo name<o:p></o:p></p>
<p class="MsoPlainText">> +                         entry.cstring[2] != 'G' && // avoid guard variables<o:p></o:p></p>
<p class="MsoPlainText">> +                         entry.cstring[2] != 'Z'))  // named local entities (if we eventually handle eSymbolTypeData, we will want this back)<o:p></o:p></p>
<p class="MsoPlainText">> +                    {<o:p></o:p></p>
<p class="MsoPlainText">> +                        CPPLanguageRuntime::MethodName cxx_method (mangled.GetDemangledName());<o:p></o:p></p>
<p class="MsoPlainText">> +                        entry.cstring = cxx_method.GetBasename ().GetCString();<o:p></o:p></p>
<p class="MsoPlainText">> +                        if (entry.cstring && entry.cstring[0])<o:p></o:p></p>
<p class="MsoPlainText">> +                        {<o:p></o:p></p>
<p class="MsoPlainText">> +                            // ConstString objects permanently store the string in the pool so calling<o:p></o:p></p>
<p class="MsoPlainText">> +                            // GetCString() on the value gets us a const char * that will never go away<o:p></o:p></p>
<p class="MsoPlainText">> +                            const char *const_context = ConstString(cxx_method.GetContext()).GetCString();<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +                            if (entry.cstring[0] == '~' || !cxx_method.GetQualifiers().empty())<o:p></o:p></p>
<p class="MsoPlainText">> +                            {<o:p></o:p></p>
<p class="MsoPlainText">> +                                // The first character of the demangled basename is '~' which<o:p></o:p></p>
<p class="MsoPlainText">> +                                // means we have a class destructor. We can use this information<o:p></o:p></p>
<p class="MsoPlainText">> +                                // to help us know what is a class and what isn't.<o:p></o:p></p>
<p class="MsoPlainText">> +                                if (class_contexts.find(const_context) == class_contexts.end())<o:p></o:p></p>
<p class="MsoPlainText">> +                                    class_contexts.insert(const_context);<o:p></o:p></p>
<p class="MsoPlainText">> +                                m_method_to_index.Append (entry);<o:p></o:p></p>
<p class="MsoPlainText">> +                            }<o:p></o:p></p>
<p class="MsoPlainText">> +                            else<o:p></o:p></p>
<p class="MsoPlainText">> +                            {<o:p></o:p></p>
<p class="MsoPlainText">> +                                if (const_context && const_context[0])<o:p></o:p></p>
<p class="MsoPlainText">> +                                {<o:p></o:p></p>
<p class="MsoPlainText">> +                                    if (class_contexts.find(const_context) != class_contexts.end())<o:p></o:p></p>
<p class="MsoPlainText">> +                                    {<o:p></o:p></p>
<p class="MsoPlainText">> +                                        // The current decl context is in our "class_contexts" which means<o:p></o:p></p>
<p class="MsoPlainText">> +                                        // this is a method on a class<o:p></o:p></p>
<p class="MsoPlainText">> +                                        m_method_to_index.Append (entry);<o:p></o:p></p>
<p class="MsoPlainText">> +                                    }<o:p></o:p></p>
<p class="MsoPlainText">> +                                    else<o:p></o:p></p>
<p class="MsoPlainText">> +                                    {<o:p></o:p></p>
<p class="MsoPlainText">> +                                        // We don't know if this is a function basename or a method,<o:p></o:p></p>
<p class="MsoPlainText">> +                                        // so put it into a temporary collection so once we are done<o:p></o:p></p>
<p class="MsoPlainText">> +                                        // we can look in class_contexts to see if each entry is a class<o:p></o:p></p>
<p class="MsoPlainText">> +                                        // or just a function and will put any remaining items into<o:p></o:p></p>
<p class="MsoPlainText">> +                                        // m_method_to_index or m_basename_to_index as needed<o:p></o:p></p>
<p class="MsoPlainText">> +                                        mangled_name_to_index.Append (entry);<o:p></o:p></p>
<p class="MsoPlainText">> +                                        symbol_contexts[entry.value] = const_context;<o:p></o:p></p>
<p class="MsoPlainText">> +                                    }<o:p></o:p></p>
<p class="MsoPlainText">> +                                }<o:p></o:p></p>
<p class="MsoPlainText">> +                                else<o:p></o:p></p>
<p class="MsoPlainText">> +                                {<o:p></o:p></p>
<p class="MsoPlainText">> +                                    // No context for this function so this has to be a basename<o:p></o:p></p>
<p class="MsoPlainText">> +                                    m_basename_to_index.Append(entry);<o:p></o:p></p>
<p class="MsoPlainText">> +                                }<o:p></o:p></p>
<p class="MsoPlainText">> +                            }<o:p></o:p></p>
<p class="MsoPlainText">> +                        }<o:p></o:p></p>
<p class="MsoPlainText">> +                    }<o:p></o:p></p>
<p class="MsoPlainText">> +                }<o:p></o:p></p>
<p class="MsoPlainText">> +            }<o:p></o:p></p>
<p class="MsoPlainText">> +            <o:p></o:p></p>
<p class="MsoPlainText">>             entry.cstring = mangled.GetDemangledName().GetCString();<o:p></o:p></p>
<p class="MsoPlainText">>             if (entry.cstring && entry.cstring[0])<o:p></o:p></p>
<p class="MsoPlainText">>                 m_name_to_index.Append (entry);<o:p></o:p></p>
<p class="MsoPlainText">> @@ -326,15 +390,64 @@ Symtab::InitNameIndexes()<o:p></o:p></p>
<p class="MsoPlainText">>             }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">>         }<o:p></o:p></p>
<p class="MsoPlainText">> +        <o:p></o:p></p>
<p class="MsoPlainText">> +        size_t count;<o:p></o:p></p>
<p class="MsoPlainText">> +        if (!mangled_name_to_index.IsEmpty())<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            count = mangled_name_to_index.GetSize();<o:p></o:p></p>
<p class="MsoPlainText">> +            for (size_t i=0; i<count; ++i)<o:p></o:p></p>
<p class="MsoPlainText">> +            {<o:p></o:p></p>
<p class="MsoPlainText">> +                if (mangled_name_to_index.GetValueAtIndex(i, entry.value))<o:p></o:p></p>
<p class="MsoPlainText">> +                {<o:p></o:p></p>
<p class="MsoPlainText">> +                    entry.cstring = mangled_name_to_index.GetCStringAtIndex(i);<o:p></o:p></p>
<p class="MsoPlainText">> +                    if (symbol_contexts[entry.value] && class_contexts.find(symbol_contexts[entry.value]) != class_contexts.end())<o:p></o:p></p>
<p class="MsoPlainText">> +                    {<o:p></o:p></p>
<p class="MsoPlainText">> +                        m_method_to_index.Append (entry);<o:p></o:p></p>
<p class="MsoPlainText">> +                    }<o:p></o:p></p>
<p class="MsoPlainText">> +                    else<o:p></o:p></p>
<p class="MsoPlainText">> +                    {<o:p></o:p></p>
<p class="MsoPlainText">> +                        // If we got here, we have something that had a context (was inside a namespace or class)<o:p></o:p></p>
<p class="MsoPlainText">> +                        // yet we don't know if the entry<o:p></o:p></p>
<p class="MsoPlainText">> +                        m_method_to_index.Append (entry);<o:p></o:p></p>
<p class="MsoPlainText">> +                        m_basename_to_index.Append (entry);<o:p></o:p></p>
<p class="MsoPlainText">> +                    }<o:p></o:p></p>
<p class="MsoPlainText">> +                }<o:p></o:p></p>
<p class="MsoPlainText">> +            }<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">>         m_name_to_index.Sort();<o:p></o:p></p>
<p class="MsoPlainText">>         m_name_to_index.SizeToFit();<o:p></o:p></p>
<p class="MsoPlainText">>         m_selector_to_index.Sort();<o:p></o:p></p>
<p class="MsoPlainText">>         m_selector_to_index.SizeToFit();<o:p></o:p></p>
<p class="MsoPlainText">> +        m_basename_to_index.Sort();<o:p></o:p></p>
<p class="MsoPlainText">> +        m_basename_to_index.SizeToFit();<o:p></o:p></p>
<p class="MsoPlainText">> +        m_method_to_index.Sort();<o:p></o:p></p>
<p class="MsoPlainText">> +        m_method_to_index.SizeToFit();<o:p></o:p></p>
<p class="MsoPlainText">> +    <o:p></o:p></p>
<p class="MsoPlainText">> +//        static StreamFile a ("/tmp/a.txt");<o:p></o:p></p>
<p class="MsoPlainText">> +//<o:p></o:p></p>
<p class="MsoPlainText">> +//        count = m_basename_to_index.GetSize();<o:p></o:p></p>
<p class="MsoPlainText">> +//        if (count)<o:p></o:p></p>
<p class="MsoPlainText">> +//        {<o:p></o:p></p>
<p class="MsoPlainText">> +//            for (size_t i=0; i<count; ++i)<o:p></o:p></p>
<p class="MsoPlainText">> +//            {<o:p></o:p></p>
<p class="MsoPlainText">> +//                if (m_basename_to_index.GetValueAtIndex(i, entry.value))<o:p></o:p></p>
<p class="MsoPlainText">> +//                    a.Printf ("%s BASENAME\n", m_symbols[entry.value].GetMangled().GetName().GetCString());<o:p></o:p></p>
<p class="MsoPlainText">> +//            }<o:p></o:p></p>
<p class="MsoPlainText">> +//        }<o:p></o:p></p>
<p class="MsoPlainText">> +//        count = m_method_to_index.GetSize();<o:p></o:p></p>
<p class="MsoPlainText">> +//        if (count)<o:p></o:p></p>
<p class="MsoPlainText">> +//        {<o:p></o:p></p>
<p class="MsoPlainText">> +//            for (size_t i=0; i<count; ++i)<o:p></o:p></p>
<p class="MsoPlainText">> +//            {<o:p></o:p></p>
<p class="MsoPlainText">> +//                if (m_method_to_index.GetValueAtIndex(i, entry.value))<o:p></o:p></p>
<p class="MsoPlainText">> +//                    a.Printf ("%s METHOD\n", m_symbols[entry.value].GetMangled().GetName().GetCString());<o:p></o:p></p>
<p class="MsoPlainText">> +//            }<o:p></o:p></p>
<p class="MsoPlainText">> +//        }<o:p></o:p></p>
<p class="MsoPlainText">>     }<o:p></o:p></p>
<p class="MsoPlainText">> }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> void<o:p></o:p></p>
<p class="MsoPlainText">> -Symtab::AppendSymbolNamesToMap (const IndexCollection &indexes,
<o:p></o:p></p>
<p class="MsoPlainText">> +Symtab::AppendSymbolNamesToMap (const IndexCollection &indexes,<o:p></o:p></p>
<p class="MsoPlainText">>                                 bool add_demangled,<o:p></o:p></p>
<p class="MsoPlainText">>                                 bool add_mangled,<o:p></o:p></p>
<p class="MsoPlainText">>                                 NameToIndexMap &name_to_index_map) const<o:p></o:p></p>
<p class="MsoPlainText">> @@ -1009,6 +1122,7 @@ Symtab::SymbolIndicesToSymbolContextList<o:p></o:p></p>
<p class="MsoPlainText">>     // No need to protect this call using m_mutex all other method calls are<o:p></o:p></p>
<p class="MsoPlainText">>     // already thread safe.<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> +    const bool merge_symbol_into_function = true;<o:p></o:p></p>
<p class="MsoPlainText">>     size_t num_indices = symbol_indexes.size();<o:p></o:p></p>
<p class="MsoPlainText">>     if (num_indices > 0)<o:p></o:p></p>
<p class="MsoPlainText">>     {<o:p></o:p></p>
<p class="MsoPlainText">> @@ -1018,7 +1132,7 @@ Symtab::SymbolIndicesToSymbolContextList<o:p></o:p></p>
<p class="MsoPlainText">>         {<o:p></o:p></p>
<p class="MsoPlainText">>             sc.symbol = SymbolAtIndex (symbol_indexes[i]);<o:p></o:p></p>
<p class="MsoPlainText">>             if (sc.symbol)<o:p></o:p></p>
<p class="MsoPlainText">> -                sc_list.Append (sc);<o:p></o:p></p>
<p class="MsoPlainText">> +                sc_list.AppendIfUnique(sc, merge_symbol_into_function);<o:p></o:p></p>
<p class="MsoPlainText">>         }<o:p></o:p></p>
<p class="MsoPlainText">>     }<o:p></o:p></p>
<p class="MsoPlainText">> }<o:p></o:p></p>
<p class="MsoPlainText">> @@ -1031,11 +1145,53 @@ Symtab::FindFunctionSymbols (const Const<o:p></o:p></p>
<p class="MsoPlainText">> {<o:p></o:p></p>
<p class="MsoPlainText">>     size_t count = 0;<o:p></o:p></p>
<p class="MsoPlainText">>     std::vector<uint32_t> symbol_indexes;<o:p></o:p></p>
<p class="MsoPlainText">> -    if (name_type_mask & (eFunctionNameTypeBase | eFunctionNameTypeFull | eFunctionNameTypeAuto))<o:p></o:p></p>
<p class="MsoPlainText">> +    <o:p></o:p></p>
<p class="MsoPlainText">> +    const char *name_cstr = name.GetCString();<o:p></o:p></p>
<p class="MsoPlainText">> +    <o:p></o:p></p>
<p class="MsoPlainText">> +    // eFunctionNameTypeAuto should be pre-resolved by a call to Module::PrepareForFunctionNameLookup()<o:p></o:p></p>
<p class="MsoPlainText">> +    assert ((name_type_mask & eFunctionNameTypeAuto) == 0);<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +    if (name_type_mask & (eFunctionNameTypeBase | eFunctionNameTypeFull))<o:p></o:p></p>
<p class="MsoPlainText">>     {<o:p></o:p></p>
<p class="MsoPlainText">>         FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, symbol_indexes);<o:p></o:p></p>
<p class="MsoPlainText">>     }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> +    if (name_type_mask & eFunctionNameTypeBase)<o:p></o:p></p>
<p class="MsoPlainText">> +    {<o:p></o:p></p>
<p class="MsoPlainText">> +        // From mangled names we can't tell what is a basename and what<o:p></o:p></p>
<p class="MsoPlainText">> +        // is a method name, so we just treat them the same<o:p></o:p></p>
<p class="MsoPlainText">> +        if (!m_name_indexes_computed)<o:p></o:p></p>
<p class="MsoPlainText">> +            InitNameIndexes();<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +        if (!m_basename_to_index.IsEmpty())<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            const UniqueCStringMap<uint32_t>::Entry *match;<o:p></o:p></p>
<p class="MsoPlainText">> +            for (match = m_basename_to_index.FindFirstValueForName(name_cstr);<o:p></o:p></p>
<p class="MsoPlainText">> +                 match != NULL;<o:p></o:p></p>
<p class="MsoPlainText">> +                 match = m_basename_to_index.FindNextValueForName(match))<o:p></o:p></p>
<p class="MsoPlainText">> +            {<o:p></o:p></p>
<p class="MsoPlainText">> +                symbol_indexes.push_back(match->value);<o:p></o:p></p>
<p class="MsoPlainText">> +            }<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +    }<o:p></o:p></p>
<p class="MsoPlainText">> +    <o:p></o:p></p>
<p class="MsoPlainText">> +    if (name_type_mask & eFunctionNameTypeMethod)<o:p></o:p></p>
<p class="MsoPlainText">> +    {<o:p></o:p></p>
<p class="MsoPlainText">> +        if (!m_name_indexes_computed)<o:p></o:p></p>
<p class="MsoPlainText">> +            InitNameIndexes();<o:p></o:p></p>
<p class="MsoPlainText">> +        <o:p></o:p></p>
<p class="MsoPlainText">> +        if (!m_method_to_index.IsEmpty())<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            const UniqueCStringMap<uint32_t>::Entry *match;<o:p></o:p></p>
<p class="MsoPlainText">> +            for (match = m_method_to_index.FindFirstValueForName(name_cstr);<o:p></o:p></p>
<p class="MsoPlainText">> +                 match != NULL;<o:p></o:p></p>
<p class="MsoPlainText">> +                 match = m_method_to_index.FindNextValueForName(match))<o:p></o:p></p>
<p class="MsoPlainText">> +            {<o:p></o:p></p>
<p class="MsoPlainText">> +                symbol_indexes.push_back(match->value);<o:p></o:p></p>
<p class="MsoPlainText">> +            }<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +    }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">>     if (name_type_mask & eFunctionNameTypeSelector)<o:p></o:p></p>
<p class="MsoPlainText">>     {<o:p></o:p></p>
<p class="MsoPlainText">>         if (!m_name_indexes_computed)<o:p></o:p></p>
<p class="MsoPlainText">> @@ -1044,7 +1200,7 @@ Symtab::FindFunctionSymbols (const Const<o:p></o:p></p>
<p class="MsoPlainText">>         if (!m_selector_to_index.IsEmpty())<o:p></o:p></p>
<p class="MsoPlainText">>         {<o:p></o:p></p>
<p class="MsoPlainText">>             const UniqueCStringMap<uint32_t>::Entry *match;<o:p></o:p></p>
<p class="MsoPlainText">> -            for (match = m_selector_to_index.FindFirstValueForName(name.AsCString());<o:p></o:p></p>
<p class="MsoPlainText">> +            for (match = m_selector_to_index.FindFirstValueForName(name_cstr);<o:p></o:p></p>
<p class="MsoPlainText">>                  match != NULL;<o:p></o:p></p>
<p class="MsoPlainText">>                  match = m_selector_to_index.FindNextValueForName(match))<o:p></o:p></p>
<p class="MsoPlainText">>             {<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Modified: lldb/trunk/source/Target/CPPLanguageRuntime.cpp<o:p></o:p></p>
<p class="MsoPlainText">> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/CPPLanguageRuntime.cpp?rev=178608&r1=178607&r2=178608&view=diff<o:p></o:p></p>
<p class="MsoPlainText">> ==============================================================================<o:p></o:p></p>
<p class="MsoPlainText">> --- lldb/trunk/source/Target/CPPLanguageRuntime.cpp (original)<o:p></o:p></p>
<p class="MsoPlainText">> +++ lldb/trunk/source/Target/CPPLanguageRuntime.cpp Tue Apr  2 21:00:15 2013<o:p></o:p></p>
<p class="MsoPlainText">> @@ -190,65 +190,65 @@ CPPLanguageRuntime::IsCPPMangledName (co<o:p></o:p></p>
<p class="MsoPlainText">> bool<o:p></o:p></p>
<p class="MsoPlainText">> CPPLanguageRuntime::StripNamespacesFromVariableName (const char *name, const char *&base_name_start, const char *&base_name_end)<o:p></o:p></p>
<p class="MsoPlainText">> {<o:p></o:p></p>
<p class="MsoPlainText">> -  if (base_name_end == NULL)<o:p></o:p></p>
<p class="MsoPlainText">> -    base_name_end = name + strlen (name);<o:p></o:p></p>
<p class="MsoPlainText">> +    if (base_name_end == NULL)<o:p></o:p></p>
<p class="MsoPlainText">> +        base_name_end = name + strlen (name);<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -  const char *last_colon = NULL;<o:p></o:p></p>
<p class="MsoPlainText">> -  for (const char *ptr = base_name_end; ptr != name; ptr--)<o:p></o:p></p>
<p class="MsoPlainText">> +    const char *last_colon = NULL;<o:p></o:p></p>
<p class="MsoPlainText">> +    for (const char *ptr = base_name_end; ptr != name; ptr--)<o:p></o:p></p>
<p class="MsoPlainText">>     {<o:p></o:p></p>
<p class="MsoPlainText">> -      if (*ptr == ':')<o:p></o:p></p>
<p class="MsoPlainText">> +        if (*ptr == ':')<o:p></o:p></p>
<p class="MsoPlainText">>         {<o:p></o:p></p>
<p class="MsoPlainText">> -          last_colon = ptr;<o:p></o:p></p>
<p class="MsoPlainText">> -          break;<o:p></o:p></p>
<p class="MsoPlainText">> +            last_colon = ptr;<o:p></o:p></p>
<p class="MsoPlainText">> +            break;<o:p></o:p></p>
<p class="MsoPlainText">>         }<o:p></o:p></p>
<p class="MsoPlainText">>     }<o:p></o:p></p>
<p class="MsoPlainText">> -<o:p></o:p></p>
<p class="MsoPlainText">> -  if (last_colon == NULL)<o:p></o:p></p>
<p class="MsoPlainText">> +    <o:p></o:p></p>
<p class="MsoPlainText">> +    if (last_colon == NULL)<o:p></o:p></p>
<p class="MsoPlainText">>     {<o:p></o:p></p>
<p class="MsoPlainText">> -      base_name_start = name;<o:p></o:p></p>
<p class="MsoPlainText">> -      return true;<o:p></o:p></p>
<p class="MsoPlainText">> +        base_name_start = name;<o:p></o:p></p>
<p class="MsoPlainText">> +        return true;<o:p></o:p></p>
<p class="MsoPlainText">>     }<o:p></o:p></p>
<p class="MsoPlainText">> -<o:p></o:p></p>
<p class="MsoPlainText">> -  // Can't have a C++ name that begins with a single ':', nor contains an internal single ':'<o:p></o:p></p>
<p class="MsoPlainText">> -  if (last_colon == name)<o:p></o:p></p>
<p class="MsoPlainText">> -    return false;<o:p></o:p></p>
<p class="MsoPlainText">> -  else if (last_colon[-1] != ':')<o:p></o:p></p>
<p class="MsoPlainText">> -    return false;<o:p></o:p></p>
<p class="MsoPlainText">> -  else<o:p></o:p></p>
<p class="MsoPlainText">> +    <o:p></o:p></p>
<p class="MsoPlainText">> +    // Can't have a C++ name that begins with a single ':', nor contains an internal single ':'<o:p></o:p></p>
<p class="MsoPlainText">> +    if (last_colon == name)<o:p></o:p></p>
<p class="MsoPlainText">> +        return false;<o:p></o:p></p>
<p class="MsoPlainText">> +    else if (last_colon[-1] != ':')<o:p></o:p></p>
<p class="MsoPlainText">> +        return false;<o:p></o:p></p>
<p class="MsoPlainText">> +    else<o:p></o:p></p>
<p class="MsoPlainText">>     {<o:p></o:p></p>
<p class="MsoPlainText">> -      // FIXME: should check if there is<o:p></o:p></p>
<p class="MsoPlainText">> -      base_name_start = last_colon + 1;<o:p></o:p></p>
<p class="MsoPlainText">> -      return true;<o:p></o:p></p>
<p class="MsoPlainText">> +        // FIXME: should check if there is<o:p></o:p></p>
<p class="MsoPlainText">> +        base_name_start = last_colon + 1;<o:p></o:p></p>
<p class="MsoPlainText">> +        return true;<o:p></o:p></p>
<p class="MsoPlainText">>     }<o:p></o:p></p>
<p class="MsoPlainText">> }<o:p></o:p></p>
<p class="MsoPlainText">> bool<o:p></o:p></p>
<p class="MsoPlainText">> CPPLanguageRuntime::IsPossibleCPPCall (const char *name, const char *&base_name_start, const char *&base_name_end)<o:p></o:p></p>
<p class="MsoPlainText">> {<o:p></o:p></p>
<p class="MsoPlainText">>     if (!name)<o:p></o:p></p>
<p class="MsoPlainText">> -      return false;<o:p></o:p></p>
<p class="MsoPlainText">> +        return false;<o:p></o:p></p>
<p class="MsoPlainText">>     // For now, I really can't handle taking template names apart, so if you<o:p></o:p></p>
<p class="MsoPlainText">>     // have < or > I'll say "could be CPP but leave the base_name empty which<o:p></o:p></p>
<p class="MsoPlainText">>     // means I couldn't figure out what to use for that.<o:p></o:p></p>
<p class="MsoPlainText">>     // FIXME: Do I need to do more sanity checking here?<o:p></o:p></p>
<p class="MsoPlainText">> -<o:p></o:p></p>
<p class="MsoPlainText">> +    <o:p></o:p></p>
<p class="MsoPlainText">>     if (strchr(name, '>') != NULL || strchr (name, '>') != NULL)<o:p></o:p></p>
<p class="MsoPlainText">> -      return true;<o:p></o:p></p>
<p class="MsoPlainText">> -<o:p></o:p></p>
<p class="MsoPlainText">> +        return true;<o:p></o:p></p>
<p class="MsoPlainText">> +    <o:p></o:p></p>
<p class="MsoPlainText">>     size_t name_len = strlen (name);<o:p></o:p></p>
<p class="MsoPlainText">> -<o:p></o:p></p>
<p class="MsoPlainText">> +    <o:p></o:p></p>
<p class="MsoPlainText">>     if (name[name_len - 1] == ')')<o:p></o:p></p>
<p class="MsoPlainText">>     {<o:p></o:p></p>
<p class="MsoPlainText">>         // We've got arguments.<o:p></o:p></p>
<p class="MsoPlainText">>         base_name_end = strchr (name, '(');<o:p></o:p></p>
<p class="MsoPlainText">>         if (base_name_end == NULL)<o:p></o:p></p>
<p class="MsoPlainText">> -          return false;<o:p></o:p></p>
<p class="MsoPlainText">> -<o:p></o:p></p>
<p class="MsoPlainText">> +            return false;<o:p></o:p></p>
<p class="MsoPlainText">> +        <o:p></o:p></p>
<p class="MsoPlainText">>         // FIXME: should check that this parenthesis isn't a template specialized<o:p></o:p></p>
<p class="MsoPlainText">>         // on a function type or something gross like that...<o:p></o:p></p>
<p class="MsoPlainText">>     }<o:p></o:p></p>
<p class="MsoPlainText">>     else<o:p></o:p></p>
<p class="MsoPlainText">>         base_name_end = name + strlen (name);<o:p></o:p></p>
<p class="MsoPlainText">> -<o:p></o:p></p>
<p class="MsoPlainText">> +    <o:p></o:p></p>
<p class="MsoPlainText">>     return StripNamespacesFromVariableName (name, base_name_start, base_name_end);<o:p></o:p></p>
<p class="MsoPlainText">> }<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> @@ -267,3 +267,156 @@ CPPLanguageRuntime::FindEquivalentNames(<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">>     return count;<o:p></o:p></p>
<p class="MsoPlainText">> }<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +void<o:p></o:p></p>
<p class="MsoPlainText">> +CPPLanguageRuntime::MethodName::Clear()<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +    m_full.Clear();<o:p></o:p></p>
<p class="MsoPlainText">> +    m_basename.Clear();<o:p></o:p></p>
<p class="MsoPlainText">> +    m_context = llvm::StringRef();<o:p></o:p></p>
<p class="MsoPlainText">> +    m_arguments = llvm::StringRef();<o:p></o:p></p>
<p class="MsoPlainText">> +    m_qualifiers = llvm::StringRef();<o:p></o:p></p>
<p class="MsoPlainText">> +    m_type = eTypeInvalid;<o:p></o:p></p>
<p class="MsoPlainText">> +    m_parsed = false;<o:p></o:p></p>
<p class="MsoPlainText">> +    m_parse_error = false;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +bool<o:p></o:p></p>
<p class="MsoPlainText">> +ReverseFindMatchingChars (const llvm::StringRef &s,<o:p></o:p></p>
<p class="MsoPlainText">> +                          const llvm::StringRef &left_right_chars,<o:p></o:p></p>
<p class="MsoPlainText">> +                          size_t &left_pos,<o:p></o:p></p>
<p class="MsoPlainText">> +                          size_t &right_pos,<o:p></o:p></p>
<p class="MsoPlainText">> +                          size_t pos = llvm::StringRef::npos)<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +    assert (left_right_chars.size() == 2);<o:p></o:p></p>
<p class="MsoPlainText">> +    left_pos = llvm::StringRef::npos;<o:p></o:p></p>
<p class="MsoPlainText">> +    const char left_char = left_right_chars[0];<o:p></o:p></p>
<p class="MsoPlainText">> +    const char right_char = left_right_chars[1];<o:p></o:p></p>
<p class="MsoPlainText">> +    pos = s.find_last_of(left_right_chars, pos);<o:p></o:p></p>
<p class="MsoPlainText">> +    if (pos == llvm::StringRef::npos || s[pos] == left_char)<o:p></o:p></p>
<p class="MsoPlainText">> +        return false;<o:p></o:p></p>
<p class="MsoPlainText">> +    right_pos = pos;<o:p></o:p></p>
<p class="MsoPlainText">> +    uint32_t depth = 1;<o:p></o:p></p>
<p class="MsoPlainText">> +    while (pos > 0 && depth > 0)<o:p></o:p></p>
<p class="MsoPlainText">> +    {<o:p></o:p></p>
<p class="MsoPlainText">> +        pos = s.find_last_of(left_right_chars, pos);<o:p></o:p></p>
<p class="MsoPlainText">> +        if (pos == llvm::StringRef::npos)<o:p></o:p></p>
<p class="MsoPlainText">> +            return false;<o:p></o:p></p>
<p class="MsoPlainText">> +        if (s[pos] == left_char)<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            if (--depth == 0)<o:p></o:p></p>
<p class="MsoPlainText">> +            {<o:p></o:p></p>
<p class="MsoPlainText">> +                left_pos = pos;<o:p></o:p></p>
<p class="MsoPlainText">> +                return left_pos < right_pos;<o:p></o:p></p>
<p class="MsoPlainText">> +            }            <o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +        else if (s[pos] == right_char)<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            ++depth;<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +    }<o:p></o:p></p>
<p class="MsoPlainText">> +    return false;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +void<o:p></o:p></p>
<p class="MsoPlainText">> +CPPLanguageRuntime::MethodName::Parse()<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +    if (!m_parsed && m_full)<o:p></o:p></p>
<p class="MsoPlainText">> +    {<o:p></o:p></p>
<p class="MsoPlainText">> +//        ConstString mangled;<o:p></o:p></p>
<p class="MsoPlainText">> +//        m_full.GetMangledCounterpart(mangled);<o:p></o:p></p>
<p class="MsoPlainText">> +//        printf ("\n   parsing = '%s'\n", m_full.GetCString());<o:p></o:p></p>
<p class="MsoPlainText">> +//        if (mangled)<o:p></o:p></p>
<p class="MsoPlainText">> +//            printf ("   mangled = '%s'\n", mangled.GetCString());<o:p></o:p></p>
<p class="MsoPlainText">> +        m_parse_error = false;<o:p></o:p></p>
<p class="MsoPlainText">> +        m_parsed = true;<o:p></o:p></p>
<p class="MsoPlainText">> +        llvm::StringRef full (m_full.GetCString());<o:p></o:p></p>
<p class="MsoPlainText">> +        <o:p></o:p></p>
<p class="MsoPlainText">> +        size_t arg_start, arg_end;<o:p></o:p></p>
<p class="MsoPlainText">> +        llvm::StringRef parens("()", 2);<o:p></o:p></p>
<p class="MsoPlainText">> +        if (ReverseFindMatchingChars (full, parens, arg_start, arg_end))<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            m_arguments = full.substr(arg_start, arg_end - arg_start + 1);<o:p></o:p></p>
<p class="MsoPlainText">> +            if (arg_end + 1 < full.size())<o:p></o:p></p>
<p class="MsoPlainText">> +                m_qualifiers = full.substr(arg_end + 1);<o:p></o:p></p>
<p class="MsoPlainText">> +            if (arg_start > 0)<o:p></o:p></p>
<p class="MsoPlainText">> +            {<o:p></o:p></p>
<p class="MsoPlainText">> +                size_t basename_end = arg_start;<o:p></o:p></p>
<p class="MsoPlainText">> +                size_t context_end = llvm::StringRef::npos;<o:p></o:p></p>
<p class="MsoPlainText">> +                if (basename_end > 0 && full[basename_end-1] == '>')<o:p></o:p></p>
<p class="MsoPlainText">> +                {<o:p></o:p></p>
<p class="MsoPlainText">> +                    // TODO: handle template junk...<o:p></o:p></p>
<p class="MsoPlainText">> +                    // Templated function<o:p></o:p></p>
<p class="MsoPlainText">> +                    size_t template_start, template_end;<o:p></o:p></p>
<p class="MsoPlainText">> +                    llvm::StringRef lt_gt("<>", 2);<o:p></o:p></p>
<p class="MsoPlainText">> +                    if (ReverseFindMatchingChars (full, lt_gt, template_start, template_end, basename_end))<o:p></o:p></p>
<p class="MsoPlainText">> +                        context_end = full.rfind(':', template_start);<o:p></o:p></p>
<p class="MsoPlainText">> +                }<o:p></o:p></p>
<p class="MsoPlainText">> +                if (context_end == llvm::StringRef::npos)<o:p></o:p></p>
<p class="MsoPlainText">> +                    context_end = full.rfind(':', basename_end);<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +                if (context_end == llvm::StringRef::npos)<o:p></o:p></p>
<p class="MsoPlainText">> +                    m_basename.SetString(full.substr(0, basename_end));<o:p></o:p></p>
<p class="MsoPlainText">> +                else<o:p></o:p></p>
<p class="MsoPlainText">> +                {<o:p></o:p></p>
<p class="MsoPlainText">> +                    m_context = full.substr(0, context_end - 1);<o:p></o:p></p>
<p class="MsoPlainText">> +                    const size_t basename_begin = context_end + 1;<o:p></o:p></p>
<p class="MsoPlainText">> +                    m_basename.SetString(full.substr(basename_begin, basename_end - basename_begin));<o:p></o:p></p>
<p class="MsoPlainText">> +                }<o:p></o:p></p>
<p class="MsoPlainText">> +                m_type = eTypeUnknownMethod;<o:p></o:p></p>
<p class="MsoPlainText">> +            }<o:p></o:p></p>
<p class="MsoPlainText">> +            else<o:p></o:p></p>
<p class="MsoPlainText">> +            {<o:p></o:p></p>
<p class="MsoPlainText">> +                m_parse_error = true;<o:p></o:p></p>
<p class="MsoPlainText">> +                return;<o:p></o:p></p>
<p class="MsoPlainText">> +            }<o:p></o:p></p>
<p class="MsoPlainText">> +        <o:p></o:p></p>
<p class="MsoPlainText">> +//            if (!m_context.empty())<o:p></o:p></p>
<p class="MsoPlainText">> +//                printf ("   context = '%s'\n", m_context.str().c_str());<o:p></o:p></p>
<p class="MsoPlainText">> +//            if (m_basename)<o:p></o:p></p>
<p class="MsoPlainText">> +//                printf ("  basename = '%s'\n", m_basename.GetCString());<o:p></o:p></p>
<p class="MsoPlainText">> +//            if (!m_arguments.empty())<o:p></o:p></p>
<p class="MsoPlainText">> +//                printf (" arguments = '%s'\n", m_arguments.str().c_str());<o:p></o:p></p>
<p class="MsoPlainText">> +//            if (!m_qualifiers.empty())<o:p></o:p></p>
<p class="MsoPlainText">> +//                printf ("qualifiers = '%s'\n", m_qualifiers.str().c_str());<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +        else<o:p></o:p></p>
<p class="MsoPlainText">> +        {<o:p></o:p></p>
<p class="MsoPlainText">> +            m_parse_error = true;<o:p></o:p></p>
<p class="MsoPlainText">> +//            printf ("error: didn't find matching parens for arguments\n");<o:p></o:p></p>
<p class="MsoPlainText">> +        }<o:p></o:p></p>
<p class="MsoPlainText">> +    }<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +const ConstString &<o:p></o:p></p>
<p class="MsoPlainText">> +CPPLanguageRuntime::MethodName::GetBasename ()<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +    if (!m_parsed)<o:p></o:p></p>
<p class="MsoPlainText">> +        Parse();<o:p></o:p></p>
<p class="MsoPlainText">> +    return m_basename;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +llvm::StringRef<o:p></o:p></p>
<p class="MsoPlainText">> +CPPLanguageRuntime::MethodName::GetContext ()<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +    if (!m_parsed)<o:p></o:p></p>
<p class="MsoPlainText">> +        Parse();<o:p></o:p></p>
<p class="MsoPlainText">> +    return m_context;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +llvm::StringRef<o:p></o:p></p>
<p class="MsoPlainText">> +CPPLanguageRuntime::MethodName::GetArguments ()<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +    if (!m_parsed)<o:p></o:p></p>
<p class="MsoPlainText">> +        Parse();<o:p></o:p></p>
<p class="MsoPlainText">> +    return m_arguments;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> +llvm::StringRef<o:p></o:p></p>
<p class="MsoPlainText">> +CPPLanguageRuntime::MethodName::GetQualifiers ()<o:p></o:p></p>
<p class="MsoPlainText">> +{<o:p></o:p></p>
<p class="MsoPlainText">> +    if (!m_parsed)<o:p></o:p></p>
<p class="MsoPlainText">> +        Parse();<o:p></o:p></p>
<p class="MsoPlainText">> +    return m_qualifiers;<o:p></o:p></p>
<p class="MsoPlainText">> +}<o:p></o:p></p>
<p class="MsoPlainText">> +<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> _______________________________________________<o:p></o:p></p>
<p class="MsoPlainText">> lldb-commits mailing list<o:p></o:p></p>
<p class="MsoPlainText">> lldb-commits@cs.uiuc.edu<o:p></o:p></p>
<p class="MsoPlainText">> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
</div>
</body>
</html>