diff options
author | emaste <emaste@FreeBSD.org> | 2015-07-03 16:57:06 +0000 |
---|---|---|
committer | emaste <emaste@FreeBSD.org> | 2015-07-03 16:57:06 +0000 |
commit | 8037fa4ee916fa20b3c63cbf531f4ee7e1c76138 (patch) | |
tree | 3c2e41c3be19b7fc7666ed45a5f91ec3b6e35f2a /source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp | |
parent | d61b076ede88b56f3372a55e7d1eac6a9d717120 (diff) | |
download | FreeBSD-src-8037fa4ee916fa20b3c63cbf531f4ee7e1c76138.zip FreeBSD-src-8037fa4ee916fa20b3c63cbf531f4ee7e1c76138.tar.gz |
Import LLDB as of upstream SVN 241361 (git 612c075f)
Diffstat (limited to 'source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp')
-rw-r--r-- | source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp b/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp index 50537eb..7d21b77 100644 --- a/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp +++ b/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp @@ -281,6 +281,46 @@ ItaniumABILanguageRuntime::IsVTableName (const char *name) return false; } +static std::map<ConstString, std::vector<ConstString> >& +GetAlternateManglingPrefixes() +{ + static std::map<ConstString, std::vector<ConstString> > g_alternate_mangling_prefixes; + return g_alternate_mangling_prefixes; +} + + +size_t +ItaniumABILanguageRuntime::GetAlternateManglings(const ConstString &mangled, std::vector<ConstString> &alternates) +{ + if (!mangled) + return static_cast<size_t>(0); + + alternates.clear(); + const char *mangled_cstr = mangled.AsCString(); + std::map<ConstString, std::vector<ConstString> >& alternate_mangling_prefixes = GetAlternateManglingPrefixes(); + for (std::map<ConstString, std::vector<ConstString> >::iterator it = alternate_mangling_prefixes.begin(); + it != alternate_mangling_prefixes.end(); + ++it) + { + const char *prefix_cstr = it->first.AsCString(); + if (strncmp(mangled_cstr, prefix_cstr, strlen(prefix_cstr)) == 0) + { + const std::vector<ConstString> &alternate_prefixes = it->second; + for (size_t i = 0; i < alternate_prefixes.size(); ++i) + { + std::string alternate_mangling(alternate_prefixes[i].AsCString()); + alternate_mangling.append(mangled_cstr + strlen(prefix_cstr)); + + alternates.push_back(ConstString(alternate_mangling.c_str())); + } + + return alternates.size(); + } + } + + return static_cast<size_t>(0); +} + //------------------------------------------------------------------ // Static Functions //------------------------------------------------------------------ @@ -304,6 +344,17 @@ ItaniumABILanguageRuntime::Initialize() PluginManager::RegisterPlugin (GetPluginNameStatic(), "Itanium ABI for the C++ language", CreateInstance); + + // Alternate manglings for std::basic_string<...> + std::vector<ConstString> basic_string_alternates; + basic_string_alternates.push_back(ConstString("_ZNSs")); + basic_string_alternates.push_back(ConstString("_ZNKSs")); + std::map<ConstString, std::vector<ConstString> >& alternate_mangling_prefixes = GetAlternateManglingPrefixes(); + + alternate_mangling_prefixes[ConstString("_ZNSbIcSt17char_traits<char>St15allocator<char>E")] = + basic_string_alternates; + alternate_mangling_prefixes[ConstString("_ZNKSbIcSt17char_traits<char>St15allocator<char>E")] = + basic_string_alternates; } void |