Skip to content

Commit b5022be

Browse files
plafosseclaude
andcommitted
GNU3 demangler: fix two bugs, remove dead code, guard debug helpers
- Fix DemangleBaseUnresolvedName: consume 'on' prefix before reading operator chars - Fix PeekString(32) in Intel Vector ABI z/Z disambiguation: use min(32, Length()) - Remove unused NextIsOneOf and ReadUntil Reader methods - Guard GetRaw, GetTemplateType, and PrintTables behind GNUDEMANGLE_DEBUG Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent f5a7ceb commit b5022be

2 files changed

Lines changed: 15 additions & 25 deletions

File tree

demangler/gnu3/demangle_gnu3.cpp

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -261,22 +261,12 @@ string DemangleGNU3Reader::PeekString(size_t count)
261261

262262

263263

264-
bool DemangleGNU3Reader::NextIsOneOf(const string& list)
265-
{
266-
char elm = Peek();
267-
for (auto a : list)
268-
{
269-
if (a == elm)
270-
return true;
271-
}
272-
return false;
273-
}
274-
275-
264+
#ifdef GNUDEMANGLE_DEBUG
276265
string DemangleGNU3Reader::GetRaw()
277266
{
278267
return m_data.substr(m_offset);
279268
}
269+
#endif
280270

281271

282272

@@ -291,14 +281,6 @@ string DemangleGNU3Reader::ReadString(size_t count)
291281
}
292282

293283

294-
string DemangleGNU3Reader::ReadUntil(char sentinal)
295-
{
296-
size_t pos = m_data.find_first_of(sentinal, m_offset);
297-
if (pos == string::npos)
298-
throw DemangleException();
299-
return ReadString(pos);
300-
}
301-
302284

303285

304286
// ===== DemangleGNU3 implementation =====
@@ -371,12 +353,14 @@ void DemangleGNU3::PushTemplateType(const DemangledTypeNode& type)
371353
}
372354

373355

356+
#ifdef GNUDEMANGLE_DEBUG
374357
const DemangledTypeNode& DemangleGNU3::GetTemplateType(size_t ref)
375358
{
376359
if (ref >= m_templateSubstitute.size())
377360
throw DemangleException();
378361
return m_templateSubstitute[ref];
379362
}
363+
#endif
380364

381365

382366
void DemangleGNU3::PushType(const DemangledTypeNode& type)
@@ -393,6 +377,7 @@ const DemangledTypeNode& DemangleGNU3::GetType(size_t ref)
393377
}
394378

395379

380+
#ifdef GNUDEMANGLE_DEBUG
396381
void DemangleGNU3::PrintTables()
397382
{
398383
LogDebug("Substitution Table\n");
@@ -407,6 +392,7 @@ void DemangleGNU3::PrintTables()
407392
LogDebug("[%d] %s\n", i-1, GetTemplateType(i).GetString().c_str());
408393
}
409394
}
395+
#endif
410396

411397

412398
void DemangleGNU3::DemangleCVQualifiers(bool& cnst, bool& vltl, bool& rstrct)
@@ -1440,6 +1426,7 @@ QualifiedName DemangleGNU3::DemangleBaseUnresolvedName()
14401426
const string str = m_reader.PeekString(2);
14411427
if (str == "on")
14421428
{
1429+
m_reader.Consume(); m_reader.Consume(); // skip 'o','n' prefix
14431430
out.push_back(GetOperator(m_reader.Read(), m_reader.Read()));
14441431
if (m_reader.Peek() == 'I')
14451432
{
@@ -2418,7 +2405,7 @@ DemangledTypeNode DemangleGNU3::DemangleSymbol(QualifiedName& varName)
24182405
// that don't appear in valid vparameter sequences.
24192406
if (!isVectorABI && (peekChar == 'z' || peekChar == 'Z'))
24202407
{
2421-
_STD_STRING ahead = m_reader.PeekString(32);
2408+
_STD_STRING ahead = m_reader.PeekString(std::min((size_t)32, m_reader.Length()));
24222409
if (ahead.size() >= 3 && (ahead[1] == 'M' || ahead[1] == 'N'))
24232410
{
24242411
size_t pos = 2;

demangler/gnu3/demangle_gnu3.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ class DemangleGNU3Reader
5252
DemangleGNU3Reader(const _STD_STRING& data);
5353
void Reset(const _STD_STRING& data);
5454
_STD_STRING PeekString(size_t count=1);
55-
bool NextIsOneOf(const _STD_STRING& list);
55+
#ifdef GNUDEMANGLE_DEBUG
5656
_STD_STRING GetRaw();
57+
#endif
5758
_STD_STRING ReadString(size_t count=1);
58-
_STD_STRING ReadUntil(char sentinal);
5959

6060
size_t Length() const { return m_data.length() - m_offset; }
6161

@@ -148,20 +148,23 @@ class DemangleGNU3
148148
int64_t DemangleNumber();
149149
DemangledTypeNode DemangleNestedName(bool* allTypeTemplateArgs = nullptr);
150150
void PushTemplateType(const DemangledTypeNode& type);
151-
const DemangledTypeNode& GetTemplateType(size_t ref);
152151
void PushType(const DemangledTypeNode& type);
153152
const DemangledTypeNode& GetType(size_t ref);
154153

155154
DemangledTypeNode CreateUnknownType(const BN::QualifiedName& s);
156155
DemangledTypeNode CreateUnknownType(const _STD_STRING& s);
157156
static void ExtendTypeName(DemangledTypeNode& type, const _STD_STRING& extend);
158157

158+
#ifdef GNUDEMANGLE_DEBUG
159+
const DemangledTypeNode& GetTemplateType(size_t ref);
160+
void PrintTables();
161+
#endif
162+
159163
public:
160164
DemangleGNU3(BN::Architecture* arch, const _STD_STRING& mangledName);
161165
void Reset(BN::Architecture* arch, const _STD_STRING& mangledName);
162166
DemangledTypeNode DemangleSymbol(BN::QualifiedName& varName);
163167
BN::QualifiedName GetVarName() const { return m_varName; }
164-
void PrintTables();
165168
};
166169

167170

0 commit comments

Comments
 (0)