diff options
| author | Greg Clayton <gclayton@apple.com> | 2015-03-05 23:12:02 +0000 |
|---|---|---|
| committer | Greg Clayton <gclayton@apple.com> | 2015-03-05 23:12:02 +0000 |
| commit | 12ba733ce8ec0dc51d6353999c43bd30c6221091 (patch) | |
| tree | f9ec050572969f432596a56c23ce4b253e60d356 /lldb/source/Expression/ClangExpressionDeclMap.cpp | |
| parent | 28d94b1df214a04f479a65000eb37e56ef5c8c39 (diff) | |
| download | bcm5719-llvm-12ba733ce8ec0dc51d6353999c43bd30c6221091.tar.gz bcm5719-llvm-12ba733ce8ec0dc51d6353999c43bd30c6221091.zip | |
When we have a symbol, like "NSLog" that we try to call in an expression, make sure we prioritize the external symbols over the internal one.
This is a temporary fix until a more comprehensive fix can be made for finding functions that we call in expressions.
We find "NSLog" in ClangExpressionDeclMap::FindExternalVisibleDecls() in after a call to target->GetImages().FindFunctions(...). Note that there are two symbols: NSLog from CFNetwork which is not external, and NSLog from Foundation which _is_ external. We do something with the external symbol with:
if (extern_symbol)
{
AddOneFunction (context, NULL, extern_symbol, current_id);
context.m_found.function = true;
}
Then later we try to lookup the _Z5NSLogP8NSStringz name and we don't find it so we call ClangExpressionDeclMap::GetFunctionAddress() with "_Z5NSLogP8NSStringz" as the name and the sc_list_size is zero at the "if" statement at line 568 because we don't find the mangled name and we extract the basename "NSLog" and call:
FindCodeSymbolInContext(ConstString(basename), m_parser_vars->m_sym_ctx, sc_list);
sc_list_size = sc_list.GetSize();
and we get a list size of two again, and we proceed to search for the symbol again, this time ignoring the external vs non-external-ness of the symbols that we find. This fix ensures we prioritize the external symbol until we get a real fix from Sean Callanan when he gets back to make sure we don't do multiple lookups for the same symbol we already resolved.
<rdar://problem/19879282>
llvm-svn: 231420
Diffstat (limited to 'lldb/source/Expression/ClangExpressionDeclMap.cpp')
| -rw-r--r-- | lldb/source/Expression/ClangExpressionDeclMap.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/lldb/source/Expression/ClangExpressionDeclMap.cpp b/lldb/source/Expression/ClangExpressionDeclMap.cpp index 5dc5ca53839..906065d9a14 100644 --- a/lldb/source/Expression/ClangExpressionDeclMap.cpp +++ b/lldb/source/Expression/ClangExpressionDeclMap.cpp @@ -585,11 +585,14 @@ ClangExpressionDeclMap::GetFunctionAddress } } + lldb::addr_t intern_callable_load_addr = LLDB_INVALID_ADDRESS; + for (uint32_t i=0; i<sc_list_size; ++i) { SymbolContext sym_ctx; sc_list.GetContextAtIndex(i, sym_ctx); + lldb::addr_t callable_load_addr = LLDB_INVALID_ADDRESS; if (sym_ctx.function) @@ -602,7 +605,13 @@ ClangExpressionDeclMap::GetFunctionAddress } else if (sym_ctx.symbol) { - callable_load_addr = sym_ctx.symbol->ResolveCallableAddress(*target); + if (sym_ctx.symbol->IsExternal()) + callable_load_addr = sym_ctx.symbol->ResolveCallableAddress(*target); + else + { + if (intern_callable_load_addr == LLDB_INVALID_ADDRESS) + intern_callable_load_addr = sym_ctx.symbol->ResolveCallableAddress(*target); + } } if (callable_load_addr != LLDB_INVALID_ADDRESS) @@ -611,6 +620,14 @@ ClangExpressionDeclMap::GetFunctionAddress return true; } } + + // See if we found an internal symbol + if (intern_callable_load_addr != LLDB_INVALID_ADDRESS) + { + func_addr = intern_callable_load_addr; + return true; + } + return false; } |

