Index: source/Expression/IRForTarget.cpp =================================================================== --- source/Expression/IRForTarget.cpp +++ source/Expression/IRForTarget.cpp @@ -42,6 +42,50 @@ static char ID; +namespace { + +std::map std_alternate_mangling_prefixes; + +void +InitStdAlternateManglingPrefixes() +{ + if (!std_alternate_mangling_prefixes.empty()) + return; + + std_alternate_mangling_prefixes[lldb_private::ConstString("_ZNSbIcSt17char_traitsSt15allocatorE")] = + lldb_private::ConstString("_ZNSs"); + std_alternate_mangling_prefixes[lldb_private::ConstString("_ZNKSbIcSt17char_traitsSt15allocatorE")] = + lldb_private::ConstString("_ZNKSs"); +} + +bool +GetStdAlternateMangling(const lldb_private::ConstString &mangled, lldb_private::ConstString &alternate) +{ + InitStdAlternateManglingPrefixes(); + + if (!mangled) + return false; + + const char *mangled_cstr = mangled.AsCString(); + for (std::map::iterator it = std_alternate_mangling_prefixes.begin(); + it != std_alternate_mangling_prefixes.end(); + ++it) + { + const char *prefix_cstr = it->first.AsCString(); + if (strncmp(mangled_cstr, prefix_cstr, strlen(prefix_cstr)) == 0) + { + std::string alternate_mangling(it->second.AsCString()); + alternate_mangling.append(mangled_cstr + strlen(prefix_cstr)); + alternate.SetCString(alternate_mangling.c_str()); + return true; + } + } + + return false; +} + +} // anonymous namespace + IRForTarget::StaticDataAllocator::StaticDataAllocator(lldb_private::IRExecutionUnit &execution_unit) : m_execution_unit(execution_unit), m_stream_string(lldb_private::Stream::eBinary, execution_unit.GetAddressByteSize(), execution_unit.GetByteOrder()), @@ -226,26 +270,21 @@ { if (!m_decl_map->GetFunctionInfo (fun_decl, fun_addr)) { - lldb_private::ConstString altnernate_name; + lldb_private::ConstString alternate_name; bool found_it = m_decl_map->GetFunctionAddress (name, fun_addr); if (!found_it) { - // Check for an alternate mangling for "std::basic_string" - // that is part of the itanium C++ name mangling scheme - const char *name_cstr = name.GetCString(); - if (name_cstr && strncmp(name_cstr, "_ZNKSbIcE", strlen("_ZNKSbIcE")) == 0) - { - std::string alternate_mangling("_ZNKSs"); - alternate_mangling.append (name_cstr + strlen("_ZNKSbIcE")); - altnernate_name.SetCString(alternate_mangling.c_str()); - found_it = m_decl_map->GetFunctionAddress (altnernate_name, fun_addr); - } + // Check for an alternate mangling for names from the standard library. + // For example, "std::basic_string<...>" has an alternate mangling scheme per + // the Itanium C++ ABI. + if (GetStdAlternateMangling(name, alternate_name)) + found_it = m_decl_map->GetFunctionAddress (alternate_name, fun_addr); } if (!found_it) { lldb_private::Mangled mangled_name(name); - lldb_private::Mangled alt_mangled_name(altnernate_name); + lldb_private::Mangled alt_mangled_name(alternate_name); if (log) { if (alt_mangled_name)