Index: lldb/include/lldb/Symbol/Symbol.h =================================================================== --- lldb/include/lldb/Symbol/Symbol.h +++ lldb/include/lldb/Symbol/Symbol.h @@ -43,7 +43,9 @@ bool Compare(ConstString name, lldb::SymbolType type) const; - void Dump(Stream *s, Target *target, uint32_t index) const; + void Dump(Stream *s, Target *target, uint32_t index, + Mangled::NamePreference name_preference = + Mangled::ePreferDemangled) const; bool ValueIsAddress() const; Index: lldb/include/lldb/Symbol/Symtab.h =================================================================== --- lldb/include/lldb/Symbol/Symtab.h +++ lldb/include/lldb/Symbol/Symtab.h @@ -40,8 +40,12 @@ uint32_t AddSymbol(const Symbol &symbol); size_t GetNumSymbols() const; void SectionFileAddressesChanged(); - void Dump(Stream *s, Target *target, SortOrder sort_type); - void Dump(Stream *s, Target *target, std::vector &indexes) const; + void + Dump(Stream *s, Target *target, SortOrder sort_type, + Mangled::NamePreference name_preference = Mangled::ePreferDemangled); + void Dump(Stream *s, Target *target, std::vector &indexes, + Mangled::NamePreference name_preference = + Mangled::ePreferDemangled) const; uint32_t GetIndexForSymbol(const Symbol *symbol) const; std::recursive_mutex &GetMutex() { return m_mutex; } Symbol *FindSymbolByID(lldb::user_id_t uid) const; Index: lldb/packages/Python/lldbsuite/test/commands/target/dump-symtab-demangle/Makefile =================================================================== --- /dev/null +++ lldb/packages/Python/lldbsuite/test/commands/target/dump-symtab-demangle/Makefile @@ -0,0 +1,2 @@ +CXX_SOURCES := main.cpp +include Makefile.rules Index: lldb/packages/Python/lldbsuite/test/commands/target/dump-symtab-demangle/TestDumpSymtabDemangle.py =================================================================== --- /dev/null +++ lldb/packages/Python/lldbsuite/test/commands/target/dump-symtab-demangle/TestDumpSymtabDemangle.py @@ -0,0 +1,26 @@ +""" +Test 'target modules dump symtab -m' doesn't demangle symbols. +""" + +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + +class TestCase(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + @skipIfWindows # We assume Itanium ABI mangling here which isn't used on Windows. + @no_debug_info_test + def test(self): + self.build() + exe = self.getBuildArtifact("a.out") + target = self.dbg.CreateTarget(exe) + self.assertTrue(target, VALID_TARGET) + + # First test that we demangle by default and our mangled symbol isn't in the output. + self.expect("target modules dump symtab", substrs=["foo::bar(int)"]) + self.expect("target modules dump symtab", matching=False, substrs=["_ZN3foo3barEi"]) + + # Turn off demangling and make sure that we now see the mangled name in the output. + self.expect("target modules dump symtab -m", substrs=["_ZN3foo3barEi"]) Index: lldb/packages/Python/lldbsuite/test/commands/target/dump-symtab-demangle/main.cpp =================================================================== --- /dev/null +++ lldb/packages/Python/lldbsuite/test/commands/target/dump-symtab-demangle/main.cpp @@ -0,0 +1,3 @@ +namespace foo { void bar(int i) {} } + +int main(int argc, char **argv) { foo::bar(1); } Index: lldb/source/Commands/CommandObjectTarget.cpp =================================================================== --- lldb/source/Commands/CommandObjectTarget.cpp +++ lldb/source/Commands/CommandObjectTarget.cpp @@ -1420,12 +1420,13 @@ } static void DumpModuleSymtab(CommandInterpreter &interpreter, Stream &strm, - Module *module, SortOrder sort_order) { + Module *module, SortOrder sort_order, + Mangled::NamePreference name_preference) { if (!module) return; if (Symtab *symtab = module->GetSymtab()) symtab->Dump(&strm, interpreter.GetExecutionContext().GetTargetPtr(), - sort_order); + sort_order, name_preference); } static void DumpModuleSections(CommandInterpreter &interpreter, Stream &strm, @@ -1970,6 +1971,11 @@ const int short_option = m_getopt_table[option_idx].val; switch (short_option) { + case 'm': + m_prefer_mangled.SetCurrentValue(true); + m_prefer_mangled.SetOptionWasSet(); + break; + case 's': m_sort_order = (SortOrder)OptionArgParser::ToOptionEnum( option_arg, GetDefinitions()[option_idx].enum_values, @@ -1984,6 +1990,7 @@ void OptionParsingStarting(ExecutionContext *execution_context) override { m_sort_order = eSortOrderNone; + m_prefer_mangled.Clear(); } llvm::ArrayRef GetDefinitions() override { @@ -1991,12 +1998,16 @@ } SortOrder m_sort_order; + OptionValueBoolean m_prefer_mangled = {false, false}; }; protected: bool DoExecute(Args &command, CommandReturnObject &result) override { Target *target = &GetSelectedTarget(); uint32_t num_dumped = 0; + Mangled::NamePreference preference = + (m_options.m_prefer_mangled ? Mangled::ePreferMangled + : Mangled::ePreferDemangled); uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize(); result.GetOutputStream().SetAddressByteSize(addr_byte_size); @@ -2022,7 +2033,7 @@ DumpModuleSymtab( m_interpreter, result.GetOutputStream(), target->GetImages().GetModulePointerAtIndexUnlocked(image_idx), - m_options.m_sort_order); + m_options.m_sort_order, preference); } } else { result.AppendError("the target has no associated executable images"); @@ -2050,7 +2061,7 @@ break; num_dumped++; DumpModuleSymtab(m_interpreter, result.GetOutputStream(), module, - m_options.m_sort_order); + m_options.m_sort_order, preference); } } } else Index: lldb/source/Commands/Options.td =================================================================== --- lldb/source/Commands/Options.td +++ lldb/source/Commands/Options.td @@ -4,6 +4,8 @@ def tm_sort : Option<"sort", "s">, Group<1>, Desc<"Supply a sort order when dumping the symbol table.">, EnumArg<"SortOrder", "OptionEnumValues(g_sort_option_enumeration)">; + def tm_smn : Option<"show-mangled-names", "m">, Group<1>, + Desc<"Do not demangle symbol names before showing them.">; } let Command = "help" in { Index: lldb/source/Symbol/Symbol.cpp =================================================================== --- lldb/source/Symbol/Symbol.cpp +++ lldb/source/Symbol/Symbol.cpp @@ -210,7 +210,8 @@ s->Printf(", mangled=\"%s\"", m_mangled.GetMangledName().AsCString()); } -void Symbol::Dump(Stream *s, Target *target, uint32_t index) const { +void Symbol::Dump(Stream *s, Target *target, uint32_t index, + Mangled::NamePreference name_preference) const { s->Printf("[%5u] %6u %c%c%c %-15s ", index, GetID(), m_is_debug ? 'D' : ' ', m_is_synthetic ? 'S' : ' ', m_is_external ? 'X' : ' ', GetTypeAsString()); @@ -218,7 +219,7 @@ // Make sure the size of the symbol is up to date before dumping GetByteSize(); - ConstString name = m_mangled.GetName(GetLanguage()); + ConstString name = m_mangled.GetName(GetLanguage(), name_preference); if (ValueIsAddress()) { if (!m_addr_range.GetBaseAddress().Dump(s, nullptr, Address::DumpStyleFileAddress)) Index: lldb/source/Symbol/Symtab.cpp =================================================================== --- lldb/source/Symbol/Symtab.cpp +++ lldb/source/Symbol/Symtab.cpp @@ -70,7 +70,8 @@ m_file_addr_to_index_computed = false; } -void Symtab::Dump(Stream *s, Target *target, SortOrder sort_order) { +void Symtab::Dump(Stream *s, Target *target, SortOrder sort_order, + Mangled::NamePreference name_preference) { std::lock_guard guard(m_mutex); // s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); @@ -97,7 +98,7 @@ const_iterator end = m_symbols.end(); for (const_iterator pos = m_symbols.begin(); pos != end; ++pos) { s->Indent(); - pos->Dump(s, target, std::distance(begin, pos)); + pos->Dump(s, target, std::distance(begin, pos), name_preference); } } break; @@ -121,7 +122,8 @@ end = name_map.end(); pos != end; ++pos) { s->Indent(); - pos->second->Dump(s, target, pos->second - &m_symbols[0]); + pos->second->Dump(s, target, pos->second - &m_symbols[0], + name_preference); } } break; @@ -134,7 +136,7 @@ for (size_t i = 0; i < num_entries; ++i) { s->Indent(); const uint32_t symbol_idx = m_file_addr_to_index.GetEntryRef(i).data; - m_symbols[symbol_idx].Dump(s, target, symbol_idx); + m_symbols[symbol_idx].Dump(s, target, symbol_idx, name_preference); } break; } @@ -143,8 +145,8 @@ } } -void Symtab::Dump(Stream *s, Target *target, - std::vector &indexes) const { +void Symtab::Dump(Stream *s, Target *target, std::vector &indexes, + Mangled::NamePreference name_preference) const { std::lock_guard guard(m_mutex); const size_t num_symbols = GetNumSymbols(); @@ -162,7 +164,7 @@ size_t idx = *pos; if (idx < num_symbols) { s->Indent(); - m_symbols[idx].Dump(s, target, idx); + m_symbols[idx].Dump(s, target, idx, name_preference); } } }