Skip to content

Commit 87bc320

Browse files
committed
[lldb] Add -m option to 'target modules dump symtab' to disable demangling
Summary: This option was added downstream in swift-lldb. This upstreams this option as it seems useful and also adds the missing tests. Reviewers: #lldb, kwk, labath Reviewed By: kwk, labath Subscribers: labath, kwk, abidh, JDevlieghere, lldb-commits Tags: #lldb, #upstreaming_lldb_s_downstream_patches Differential Revision: https://reviews.llvm.org/D69944
1 parent e58985a commit 87bc320

File tree

8 files changed

+86
-16
lines changed

8 files changed

+86
-16
lines changed

lldb/include/lldb/Symbol/Symbol.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ class Symbol : public SymbolContextScope {
4343

4444
bool Compare(ConstString name, lldb::SymbolType type) const;
4545

46-
void Dump(Stream *s, Target *target, uint32_t index) const;
46+
void Dump(Stream *s, Target *target, uint32_t index,
47+
Mangled::NamePreference name_preference =
48+
Mangled::ePreferDemangled) const;
4749

4850
bool ValueIsAddress() const;
4951

lldb/include/lldb/Symbol/Symtab.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,12 @@ class Symtab {
4040
uint32_t AddSymbol(const Symbol &symbol);
4141
size_t GetNumSymbols() const;
4242
void SectionFileAddressesChanged();
43-
void Dump(Stream *s, Target *target, SortOrder sort_type);
44-
void Dump(Stream *s, Target *target, std::vector<uint32_t> &indexes) const;
43+
void
44+
Dump(Stream *s, Target *target, SortOrder sort_type,
45+
Mangled::NamePreference name_preference = Mangled::ePreferDemangled);
46+
void Dump(Stream *s, Target *target, std::vector<uint32_t> &indexes,
47+
Mangled::NamePreference name_preference =
48+
Mangled::ePreferDemangled) const;
4549
uint32_t GetIndexForSymbol(const Symbol *symbol) const;
4650
std::recursive_mutex &GetMutex() { return m_mutex; }
4751
Symbol *FindSymbolByID(lldb::user_id_t uid) const;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"""
2+
Test 'target modules dump symtab -m' doesn't demangle symbols.
3+
"""
4+
5+
from lldbsuite.test.decorators import *
6+
from lldbsuite.test.lldbtest import *
7+
from lldbsuite.test import lldbutil
8+
9+
class TestCase(TestBase):
10+
11+
mydir = TestBase.compute_mydir(__file__)
12+
13+
@no_debug_info_test
14+
def test(self):
15+
src_dir = self.getSourceDir()
16+
yaml_path = os.path.join(src_dir, "a.yaml")
17+
yaml_base, ext = os.path.splitext(yaml_path)
18+
obj_path = self.getBuildArtifact("main.o")
19+
self.yaml2obj(yaml_path, obj_path)
20+
21+
# Create a target with the object file we just created from YAML
22+
target = self.dbg.CreateTarget(obj_path)
23+
self.assertTrue(target, VALID_TARGET)
24+
25+
# First test that we demangle by default and our mangled symbol isn't in the output.
26+
self.expect("target modules dump symtab", substrs=["foo::bar(int)"])
27+
self.expect("target modules dump symtab", matching=False, substrs=["_ZN3foo3barEi"])
28+
29+
# Turn off demangling and make sure that we now see the mangled name in the output.
30+
self.expect("target modules dump symtab -m", substrs=["_ZN3foo3barEi"])
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
--- !ELF
2+
FileHeader:
3+
Class: ELFCLASS64
4+
Data: ELFDATA2LSB
5+
Type: ET_REL
6+
Machine: EM_X86_64
7+
Sections:
8+
- Name: .text
9+
Type: SHT_PROGBITS
10+
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
11+
AddressAlign: 0x0000000000000010
12+
Content: 554889E5897DFC5DC3
13+
Symbols:
14+
- Name: _ZN3foo3barEi
15+
Type: STT_FUNC
16+
Section: .text
17+
Size: 0x0000000000000009
18+
...

lldb/source/Commands/CommandObjectTarget.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1420,12 +1420,13 @@ static size_t DumpModuleObjfileHeaders(Stream &strm, ModuleList &module_list) {
14201420
}
14211421

14221422
static void DumpModuleSymtab(CommandInterpreter &interpreter, Stream &strm,
1423-
Module *module, SortOrder sort_order) {
1423+
Module *module, SortOrder sort_order,
1424+
Mangled::NamePreference name_preference) {
14241425
if (!module)
14251426
return;
14261427
if (Symtab *symtab = module->GetSymtab())
14271428
symtab->Dump(&strm, interpreter.GetExecutionContext().GetTargetPtr(),
1428-
sort_order);
1429+
sort_order, name_preference);
14291430
}
14301431

14311432
static void DumpModuleSections(CommandInterpreter &interpreter, Stream &strm,
@@ -1970,6 +1971,11 @@ class CommandObjectTargetModulesDumpSymtab
19701971
const int short_option = m_getopt_table[option_idx].val;
19711972

19721973
switch (short_option) {
1974+
case 'm':
1975+
m_prefer_mangled.SetCurrentValue(true);
1976+
m_prefer_mangled.SetOptionWasSet();
1977+
break;
1978+
19731979
case 's':
19741980
m_sort_order = (SortOrder)OptionArgParser::ToOptionEnum(
19751981
option_arg, GetDefinitions()[option_idx].enum_values,
@@ -1984,19 +1990,24 @@ class CommandObjectTargetModulesDumpSymtab
19841990

19851991
void OptionParsingStarting(ExecutionContext *execution_context) override {
19861992
m_sort_order = eSortOrderNone;
1993+
m_prefer_mangled.Clear();
19871994
}
19881995

19891996
llvm::ArrayRef<OptionDefinition> GetDefinitions() override {
19901997
return llvm::makeArrayRef(g_target_modules_dump_symtab_options);
19911998
}
19921999

19932000
SortOrder m_sort_order;
2001+
OptionValueBoolean m_prefer_mangled = {false, false};
19942002
};
19952003

19962004
protected:
19972005
bool DoExecute(Args &command, CommandReturnObject &result) override {
19982006
Target *target = &GetSelectedTarget();
19992007
uint32_t num_dumped = 0;
2008+
Mangled::NamePreference name_preference =
2009+
(m_options.m_prefer_mangled ? Mangled::ePreferMangled
2010+
: Mangled::ePreferDemangled);
20002011

20012012
uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize();
20022013
result.GetOutputStream().SetAddressByteSize(addr_byte_size);
@@ -2022,7 +2033,7 @@ class CommandObjectTargetModulesDumpSymtab
20222033
DumpModuleSymtab(
20232034
m_interpreter, result.GetOutputStream(),
20242035
target->GetImages().GetModulePointerAtIndexUnlocked(image_idx),
2025-
m_options.m_sort_order);
2036+
m_options.m_sort_order, name_preference);
20262037
}
20272038
} else {
20282039
result.AppendError("the target has no associated executable images");
@@ -2050,7 +2061,7 @@ class CommandObjectTargetModulesDumpSymtab
20502061
break;
20512062
num_dumped++;
20522063
DumpModuleSymtab(m_interpreter, result.GetOutputStream(), module,
2053-
m_options.m_sort_order);
2064+
m_options.m_sort_order, name_preference);
20542065
}
20552066
}
20562067
} else

lldb/source/Commands/Options.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ let Command = "target modules dump symtab" in {
44
def tm_sort : Option<"sort", "s">, Group<1>,
55
Desc<"Supply a sort order when dumping the symbol table.">,
66
EnumArg<"SortOrder", "OptionEnumValues(g_sort_option_enumeration)">;
7+
def tm_smn : Option<"show-mangled-names", "m">, Group<1>,
8+
Desc<"Do not demangle symbol names before showing them.">;
79
}
810

911
let Command = "help" in {

lldb/source/Symbol/Symbol.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,15 +210,16 @@ void Symbol::GetDescription(Stream *s, lldb::DescriptionLevel level,
210210
s->Printf(", mangled=\"%s\"", m_mangled.GetMangledName().AsCString());
211211
}
212212

213-
void Symbol::Dump(Stream *s, Target *target, uint32_t index) const {
213+
void Symbol::Dump(Stream *s, Target *target, uint32_t index,
214+
Mangled::NamePreference name_preference) const {
214215
s->Printf("[%5u] %6u %c%c%c %-15s ", index, GetID(), m_is_debug ? 'D' : ' ',
215216
m_is_synthetic ? 'S' : ' ', m_is_external ? 'X' : ' ',
216217
GetTypeAsString());
217218

218219
// Make sure the size of the symbol is up to date before dumping
219220
GetByteSize();
220221

221-
ConstString name = m_mangled.GetName(GetLanguage());
222+
ConstString name = m_mangled.GetName(GetLanguage(), name_preference);
222223
if (ValueIsAddress()) {
223224
if (!m_addr_range.GetBaseAddress().Dump(s, nullptr,
224225
Address::DumpStyleFileAddress))

lldb/source/Symbol/Symtab.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ void Symtab::SectionFileAddressesChanged() {
7070
m_file_addr_to_index_computed = false;
7171
}
7272

73-
void Symtab::Dump(Stream *s, Target *target, SortOrder sort_order) {
73+
void Symtab::Dump(Stream *s, Target *target, SortOrder sort_order,
74+
Mangled::NamePreference name_preference) {
7475
std::lock_guard<std::recursive_mutex> guard(m_mutex);
7576

7677
// s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
@@ -97,7 +98,7 @@ void Symtab::Dump(Stream *s, Target *target, SortOrder sort_order) {
9798
const_iterator end = m_symbols.end();
9899
for (const_iterator pos = m_symbols.begin(); pos != end; ++pos) {
99100
s->Indent();
100-
pos->Dump(s, target, std::distance(begin, pos));
101+
pos->Dump(s, target, std::distance(begin, pos), name_preference);
101102
}
102103
} break;
103104

@@ -121,7 +122,8 @@ void Symtab::Dump(Stream *s, Target *target, SortOrder sort_order) {
121122
end = name_map.end();
122123
pos != end; ++pos) {
123124
s->Indent();
124-
pos->second->Dump(s, target, pos->second - &m_symbols[0]);
125+
pos->second->Dump(s, target, pos->second - &m_symbols[0],
126+
name_preference);
125127
}
126128
} break;
127129

@@ -134,7 +136,7 @@ void Symtab::Dump(Stream *s, Target *target, SortOrder sort_order) {
134136
for (size_t i = 0; i < num_entries; ++i) {
135137
s->Indent();
136138
const uint32_t symbol_idx = m_file_addr_to_index.GetEntryRef(i).data;
137-
m_symbols[symbol_idx].Dump(s, target, symbol_idx);
139+
m_symbols[symbol_idx].Dump(s, target, symbol_idx, name_preference);
138140
}
139141
break;
140142
}
@@ -143,8 +145,8 @@ void Symtab::Dump(Stream *s, Target *target, SortOrder sort_order) {
143145
}
144146
}
145147

146-
void Symtab::Dump(Stream *s, Target *target,
147-
std::vector<uint32_t> &indexes) const {
148+
void Symtab::Dump(Stream *s, Target *target, std::vector<uint32_t> &indexes,
149+
Mangled::NamePreference name_preference) const {
148150
std::lock_guard<std::recursive_mutex> guard(m_mutex);
149151

150152
const size_t num_symbols = GetNumSymbols();
@@ -162,7 +164,7 @@ void Symtab::Dump(Stream *s, Target *target,
162164
size_t idx = *pos;
163165
if (idx < num_symbols) {
164166
s->Indent();
165-
m_symbols[idx].Dump(s, target, idx);
167+
m_symbols[idx].Dump(s, target, idx, name_preference);
166168
}
167169
}
168170
}

0 commit comments

Comments
 (0)