diff options
Diffstat (limited to 'lldb/source/Expression/ClangExpressionDeclMap.cpp')
-rw-r--r-- | lldb/source/Expression/ClangExpressionDeclMap.cpp | 86 |
1 files changed, 60 insertions, 26 deletions
diff --git a/lldb/source/Expression/ClangExpressionDeclMap.cpp b/lldb/source/Expression/ClangExpressionDeclMap.cpp index 8d19766608a..d5d381d64a2 100644 --- a/lldb/source/Expression/ClangExpressionDeclMap.cpp +++ b/lldb/source/Expression/ClangExpressionDeclMap.cpp @@ -603,12 +603,23 @@ ClangExpressionDeclMap::GetDecls(NameSearchContext &context, } ConstString name_cs(name); + SymbolContextList sym_ctxs; - Function *fn = m_sym_ctx->FindFunctionByName(name_cs.GetCString()); + m_sym_ctx->FindFunctionsByName(name_cs, false, sym_ctxs); + + for (uint32_t index = 0, num_indices = sym_ctxs.GetSize(); + index < num_indices; + ++index) + { + SymbolContext sym_ctx; + sym_ctxs.GetContextAtIndex(index, sym_ctx); + + if (sym_ctx.function) + AddOneFunction(context, sym_ctx.function, NULL); + else if(sym_ctx.symbol) + AddOneFunction(context, NULL, sym_ctx.symbol); + } - if (fn) - AddOneFunction(context, fn); - Variable *var = FindVariableInScope(*m_sym_ctx, name); if (var) @@ -749,41 +760,64 @@ ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, void ClangExpressionDeclMap::AddOneFunction(NameSearchContext &context, - Function* fun) + Function* fun, + Symbol* symbol) { Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); - - Type *fun_type = fun->GetType(); - if (!fun_type) - { - if (log) - log->PutCString("Skipped a function because it has no type"); - return; - } + NamedDecl *fun_decl; + std::auto_ptr<Value> fun_location(new Value); + const Address *fun_address; - void *fun_opaque_type = fun_type->GetOpaqueClangQualType(); + // only valid for Functions, not for Symbols + void *fun_opaque_type = NULL; + clang::ASTContext *fun_ast_context = NULL; - if (!fun_opaque_type) + if (fun) + { + Type *fun_type = fun->GetType(); + + if (!fun_type) + { + if (log) + log->PutCString("Skipped a function because it has no type"); + return; + } + + fun_opaque_type = fun_type->GetOpaqueClangQualType(); + + if (!fun_opaque_type) + { + if (log) + log->PutCString("Skipped a function because it has no Clang type"); + return; + } + + fun_address = &fun->GetAddressRange().GetBaseAddress(); + + TypeList *type_list = fun_type->GetTypeList(); + fun_ast_context = type_list->GetClangASTContext().getASTContext(); + void *copied_type = ClangASTContext::CopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type); + + fun_decl = context.AddFunDecl(copied_type); + } + else if (symbol) + { + fun_address = &symbol->GetAddressRangeRef().GetBaseAddress(); + + fun_decl = context.AddGenericFunDecl(); + } + else { if (log) - log->PutCString("Skipped a function because it has no Clang type"); + log->PutCString("AddOneFunction called with no function and no symbol"); return; } - std::auto_ptr<Value> fun_location(new Value); - - const Address &fun_address = fun->GetAddressRange().GetBaseAddress(); - lldb::addr_t load_addr = fun_address.GetLoadAddress(m_exe_ctx->process); + lldb::addr_t load_addr = fun_address->GetLoadAddress(m_exe_ctx->process); fun_location->SetValueType(Value::eValueTypeLoadAddress); fun_location->GetScalar() = load_addr; - TypeList *type_list = fun_type->GetTypeList(); - clang::ASTContext *fun_ast_context = type_list->GetClangASTContext().getASTContext(); - void *copied_type = ClangASTContext::CopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type); - - NamedDecl *fun_decl = context.AddFunDecl(copied_type); - Tuple tuple; tuple.m_decl = fun_decl; |