Index: lit/SymbolFile/DWARF/find-basic-function.cpp =================================================================== --- lit/SymbolFile/DWARF/find-basic-function.cpp +++ lit/SymbolFile/DWARF/find-basic-function.cpp @@ -8,6 +8,8 @@ // RUN: FileCheck --check-prefix=METHOD %s // RUN: lldb-test symbols --name=foo --find=function --function-flags=full %t | \ // RUN: FileCheck --check-prefix=FULL %s +// RUN: lldb-test symbols --name=_Z3fooi --find=function --function-flags=full %t | \ +// RUN: FileCheck --check-prefix=FULL-MANGLED %s // RUN: lldb-test symbols --name=foo --context=context --find=function --function-flags=base %t | \ // RUN: FileCheck --check-prefix=CONTEXT %s // RUN: lldb-test symbols --name=not_there --find=function %t | \ @@ -24,9 +26,17 @@ // METHOD-DAG: name = "sbar::foo(int)", mangled = "_ZN4sbar3fooEi" // METHOD-DAG: name = "ffbar()::sbar::foo()", mangled = "_ZZ5ffbarvEN4sbar3fooEv" -// FULL: Found 2 functions: +// FULL: Found 7 functions: // FULL-DAG: name = "foo()", mangled = "_Z3foov" // FULL-DAG: name = "foo(int)", mangled = "_Z3fooi" +// FULL-DAG: name = "bar::foo()", mangled = "_ZN3bar3fooEv" +// FULL-DAG: name = "bar::baz::foo()", mangled = "_ZN3bar3baz3fooEv" +// FULL-DAG: name = "sbar::foo()", mangled = "_ZN4sbar3fooEv" +// FULL-DAG: name = "sbar::foo(int)", mangled = "_ZN4sbar3fooEi" +// FULL-DAG: name = "ffbar()::sbar::foo()", mangled = "_ZZ5ffbarvEN4sbar3fooEv" + +// FULL-MANGLED: Found 1 functions: +// FULL-DAG: name = "foo(int)", mangled = "_Z3fooi" // CONTEXT: Found 1 functions: // CONTEXT-DAG: name = "bar::foo()", mangled = "_ZN3bar3fooEv" Index: source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp =================================================================== --- source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp +++ source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp @@ -898,6 +898,8 @@ ((mangled_cstr[0] == '_') || (::strcmp(name, mangled_cstr) != 0))) { Mangled mangled(ConstString(mangled_cstr), true); + func_basenames.Insert(mangled.GetMangledName(), + DIERef(cu_offset, die.GetOffset())); func_fullnames.Insert(mangled.GetMangledName(), DIERef(cu_offset, die.GetOffset())); ConstString demangled = mangled.GetDemangledName(cu_language); @@ -923,6 +925,8 @@ ((mangled_cstr[0] == '_') || (::strcmp(name, mangled_cstr) != 0))) { Mangled mangled(ConstString(mangled_cstr), true); + func_basenames.Insert(mangled.GetMangledName(), + DIERef(cu_offset, die.GetOffset())); func_fullnames.Insert(mangled.GetMangledName(), DIERef(cu_offset, die.GetOffset())); ConstString demangled = mangled.GetDemangledName(cu_language); Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp =================================================================== --- source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -2622,44 +2622,25 @@ if (!m_indexed) Index(); + DIEArray die_offsets; if (name_type_mask & eFunctionNameTypeFull) { - FindFunctions(name, m_function_fullname_index, include_inlines, sc_list); - - // FIXME Temporary workaround for global/anonymous namespace - // functions debugging FreeBSD and Linux binaries. If we didn't find any - // functions in the global namespace try looking in the basename index - // but ignore any returned functions that have a namespace but keep - // functions which have an anonymous namespace - // TODO: The arch in the object file isn't correct for MSVC - // binaries on windows, we should find a way to make it correct and - // handle those symbols as well. - if (sc_list.GetSize() == original_size) { - ArchSpec arch; - if (!parent_decl_ctx && GetObjectFile()->GetArchitecture(arch) && - arch.GetTriple().isOSBinFormatELF()) { - SymbolContextList temp_sc_list; - FindFunctions(name, m_function_basename_index, include_inlines, - temp_sc_list); - SymbolContext sc; - for (uint32_t i = 0; i < temp_sc_list.GetSize(); i++) { - if (temp_sc_list.GetContextAtIndex(i, sc)) { - ConstString mangled_name = - sc.GetFunctionName(Mangled::ePreferMangled); - ConstString demangled_name = - sc.GetFunctionName(Mangled::ePreferDemangled); - // Mangled names on Linux and FreeBSD are of the form: - // _ZN18function_namespace13function_nameEv. - if (strncmp(mangled_name.GetCString(), "_ZN", 3) || - !strncmp(demangled_name.GetCString(), "(anonymous namespace)", - 21)) { - sc_list.Append(sc); - } - } + uint32_t num_matches = m_function_basename_index.Find(name, die_offsets); + num_matches += m_function_method_index.Find(name, die_offsets); + for (uint32_t i = 0; i < num_matches; i++) { + const DIERef &die_ref = die_offsets[i]; + DWARFDIE die = info->GetDIE(die_ref); + if (die) { + if (!DIEInDeclContext(parent_decl_ctx, die)) + continue; // The containing decl contexts don't match + + if (resolved_dies.find(die.GetDIE()) == resolved_dies.end()) { + if (ResolveFunction(die, include_inlines, sc_list)) + resolved_dies.insert(die.GetDIE()); } } } + die_offsets.clear(); } - DIEArray die_offsets; if (name_type_mask & eFunctionNameTypeBase) { uint32_t num_base = m_function_basename_index.Find(name, die_offsets); for (uint32_t i = 0; i < num_base; i++) { @@ -2751,8 +2732,6 @@ Index(); FindFunctions(regex, m_function_basename_index, include_inlines, sc_list); - - FindFunctions(regex, m_function_fullname_index, include_inlines, sc_list); } // Return the number of variable that were appended to the list