summaryrefslogtreecommitdiff
path: root/demangler/gnu3/demangle_gnu3.h
diff options
context:
space:
mode:
authorPeter LaFosse <peter@vector35.com>2026-03-10 15:35:26 -0400
committerPeter LaFosse <peter@vector35.com>2026-03-26 17:56:23 -0400
commitaf93db2cbfd24d5da40ed2951f5b9b05bf3d565c (patch)
treea2e21d0d21fe336e3ae2d0b6297076952ee6dafa /demangler/gnu3/demangle_gnu3.h
parent9d6b64e8697ec85e8111b3d847b3e6d5853cf599 (diff)
GNU3 Demangler: fix substitution tracking, expressions, and type names
Substitution table and scoping: - Fix generic lambda auto parameters: save/replace m_templateSubstitute with 'auto' placeholders for lambda-local T_/T0_/T1_ resolution - Fix local-name template scoping with m_inLocalName flag - Fix substitution table off-by-one for all-type template args - Fix pointer-to-member type (case 'M'): set substitute=true per ABI - Fix multi-character seq-id parsing (S10_, S11_, etc.) - Fix DemangleUnresolvedType decltype (DT/Dt) prefix consumption - Add forward template ref support for cv conversion operators - Fix sr qualifier-list PushType and conditional E handling - Fix multi-level sr scope resolution without N prefix - Fix sr + unscoped template substitution table tracking - Fix I...E argument pack handling (GCC I...E vs J...E) - Fix Dp pack expansion to show '...' for concrete types Expression formatting: - Fix L_Z embedded mangled name template scope isolation - Handle LZ<encoding>E function address template args - cl expression: callable(args) format with function substitute tracking - dt/pt expressions: obj.member and obj->member directly - fp_/fp<N>_ placeholders in decltype return types - Fix fL function-param scope validation - Fix DemangleBaseUnresolvedName 'on' prefix consumption Type names (Itanium ABI spec compliance): - x/y: "long long"/"unsigned long long" - a: "signed char" (distinct from 'c' = "char") - n/o: "__int128"/"unsigned __int128" - g: "__float128" via FloatType altName - Dd/Df/De: "decimal64"/"decimal32"/"decimal128" - Dh: "_Float16" - Dp: always show "..." for pack expansion - Fix 'n' literal: __int128 not __uint128 - Fix dot extension spacing Cleanup: - Remove unused NextIsOneOf, ReadUntil, DemangleInitializer - Guard GetRaw/GetTemplateType/PrintTables behind GNUDEMANGLE_DEBUG - Remove unreachable GetNameType C/D cases - Remove dead BinaryExpression "." check Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'demangler/gnu3/demangle_gnu3.h')
-rw-r--r--demangler/gnu3/demangle_gnu3.h29
1 files changed, 21 insertions, 8 deletions
diff --git a/demangler/gnu3/demangle_gnu3.h b/demangler/gnu3/demangle_gnu3.h
index 2e46e05d..8ee0fca6 100644
--- a/demangler/gnu3/demangle_gnu3.h
+++ b/demangler/gnu3/demangle_gnu3.h
@@ -51,10 +51,10 @@ public:
DemangleGNU3Reader(const _STD_STRING& data);
void Reset(const _STD_STRING& data);
_STD_STRING PeekString(size_t count=1);
- bool NextIsOneOf(const _STD_STRING& list);
+#ifdef GNUDEMANGLE_DEBUG
_STD_STRING GetRaw();
+#endif
_STD_STRING ReadString(size_t count=1);
- _STD_STRING ReadUntil(char sentinal);
size_t Length() const { return m_data.length() - m_offset; }
@@ -109,6 +109,17 @@ class DemangleGNU3
bool m_shouldDeleteReader;
bool m_topLevel;
bool m_isOperatorOverload;
+ // Forward template reference support (for cv conversion operator types).
+ // When m_permitForwardTemplateRefs is true, DemangleTemplateSubstitution()
+ // returns a placeholder instead of throwing for out-of-bounds template params.
+ // m_pendingForwardRefs records which param indices have placeholders so that
+ // ResolveForwardTemplateRefs() can patch them once template args are known.
+ bool m_permitForwardTemplateRefs;
+ bool m_inLocalName;
+ struct ForwardRef { size_t index; };
+ _STD_VECTOR<ForwardRef> m_pendingForwardRefs;
+ void ResolveForwardTemplateRefs(DemangledTypeNode& type, const _STD_VECTOR<_STD_STRING>& args);
+ static _STD_STRING ForwardRefPlaceholder(size_t index);
enum SymbolType { Function, FunctionWithReturn, Data, VTable, Rtti, Name};
BN::QualifiedName DemangleBaseUnresolvedName();
DemangledTypeNode DemangleUnresolvedType();
@@ -121,7 +132,6 @@ class DemangleGNU3
DemangledTypeNode DemangleUnqualifiedName();
_STD_STRING DemangleSourceName();
_STD_STRING DemangleNumberAsString();
- _STD_STRING DemangleInitializer();
_STD_STRING DemangleExpression();
_STD_STRING DemanglePrimaryExpression();
DemangledTypeNode DemangleName();
@@ -129,14 +139,13 @@ class DemangleGNU3
void DemangleCVQualifiers(bool& cnst, bool& vltl, bool& rstrct);
DemangledTypeNode DemangleSubstitution();
- const DemangledTypeNode& DemangleTemplateSubstitution();
- void DemangleTemplateArgs(_STD_VECTOR<_STD_STRING>& args);
+ DemangledTypeNode DemangleTemplateSubstitution();
+ void DemangleTemplateArgs(_STD_VECTOR<_STD_STRING>& args, bool* hadNonTypeArg = nullptr);
DemangledTypeNode DemangleFunction(bool cnst, bool vltl);
DemangledTypeNode DemangleType();
int64_t DemangleNumber();
- DemangledTypeNode DemangleNestedName();
+ DemangledTypeNode DemangleNestedName(bool* allTypeTemplateArgs = nullptr);
void PushTemplateType(const DemangledTypeNode& type);
- const DemangledTypeNode& GetTemplateType(size_t ref);
void PushType(const DemangledTypeNode& type);
const DemangledTypeNode& GetType(size_t ref);
@@ -144,12 +153,16 @@ class DemangleGNU3
DemangledTypeNode CreateUnknownType(const _STD_STRING& s);
static void ExtendTypeName(DemangledTypeNode& type, const _STD_STRING& extend);
+#ifdef GNUDEMANGLE_DEBUG
+ const DemangledTypeNode& GetTemplateType(size_t ref);
+ void PrintTables();
+#endif
+
public:
DemangleGNU3(BN::Architecture* arch, const _STD_STRING& mangledName);
void Reset(BN::Architecture* arch, const _STD_STRING& mangledName);
DemangledTypeNode DemangleSymbol(BN::QualifiedName& varName);
BN::QualifiedName GetVarName() const { return m_varName; }
- void PrintTables();
};