Changed SymbolContext so when you search for functions
it returns a list of functions as a SymbolContextList.
Rewrote the clients of SymbolContext to use this
SymbolContextList.
Rewrote some of the providers of the data to SymbolContext
to make them respect preferences as to whether the list
should be cleared first; propagated that change out.
ClangExpressionDeclMap and ClangASTSource use this new
function list to properly generate function definitions -
even for functions that don't have a prototype in the
debug information.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@109476 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Expression/ClangExpressionDeclMap.cpp b/source/Expression/ClangExpressionDeclMap.cpp
index 8d19766..d5d381d 100644
--- a/source/Expression/ClangExpressionDeclMap.cpp
+++ b/source/Expression/ClangExpressionDeclMap.cpp
@@ -603,12 +603,23 @@
}
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);
- if (fn)
- AddOneFunction(context, fn);
-
+ 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);
+ }
+
Variable *var = FindVariableInScope(*m_sym_ctx, name);
if (var)
@@ -749,41 +760,64 @@
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;
- }
-
- void *fun_opaque_type = fun_type->GetOpaqueClangQualType();
-
- if (!fun_opaque_type)
- {
- if (log)
- log->PutCString("Skipped a function because it has no Clang type");
- return;
- }
-
+ NamedDecl *fun_decl;
std::auto_ptr<Value> fun_location(new Value);
+ const Address *fun_address;
- const Address &fun_address = fun->GetAddressRange().GetBaseAddress();
- lldb::addr_t load_addr = fun_address.GetLoadAddress(m_exe_ctx->process);
+ // only valid for Functions, not for Symbols
+ void *fun_opaque_type = NULL;
+ clang::ASTContext *fun_ast_context = NULL;
+
+ 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("AddOneFunction called with no function and no symbol");
+ return;
+ }
+
+ 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;