Skip to content

Commit d478378

Browse files
committed
Refactor template simplifier onto structured demangler AST
1 parent 7862d28 commit d478378

9 files changed

Lines changed: 1902 additions & 32 deletions

demangler/gnu3/demangle_gnu3.cpp

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
// See https://llvm.org/LICENSE.txt for license information.
1717

1818
#include "demangle_gnu3.h"
19+
#include "demangled_template_simplifier.h"
1920
#include <stdarg.h>
2021
#include <algorithm>
2122
#include <memory>
@@ -2555,7 +2556,7 @@ DemangledTypeNode DemangleGNU3::DemangleName()
25552556
}
25562557

25572558

2558-
DemangledTypeNode DemangleGNU3::DemangleSymbol(StringList& varName)
2559+
DemangledTypeNode DemangleGNU3::DemangleSymbol(StringList& varName, bool simplifyTemplates)
25592560
{
25602561
NestingGuard nestingGuard(*this);
25612562
indent();
@@ -2610,7 +2611,7 @@ DemangledTypeNode DemangleGNU3::DemangleSymbol(StringList& varName)
26102611
throw DemangleException();
26112612
oldTopLevel = m_topLevel;
26122613
m_topLevel = false;
2613-
DemangledTypeNode t = DemangleSymbol(name);
2614+
DemangledTypeNode t = DemangleSymbol(name, simplifyTemplates);
26142615
m_topLevel = oldTopLevel;
26152616
return DemangledTypeNode::NamedType(UnknownNamedTypeClass,
26162617
StringList{JoinNameSegments(name) + " [transaction clone]" + t.GetStringAfterName(m_platform.GetPtr())});
@@ -2662,7 +2663,7 @@ DemangledTypeNode DemangleGNU3::DemangleSymbol(StringList& varName)
26622663
if (!isVectorABI)
26632664
{
26642665
// Guard variable (original behavior)
2665-
DemangledTypeNode t = DemangleSymbol(name);
2666+
DemangledTypeNode t = DemangleSymbol(name, simplifyTemplates);
26662667
varName.push_back("guard_variable_for_" + t.GetTypeAndName(name, m_platform.GetPtr()));
26672668
type = DemangledTypeNode::IntegerType(1, false);
26682669
if (m_reader.Length() == 0)
@@ -2851,7 +2852,7 @@ DemangledTypeNode DemangleGNU3::DemangleSymbol(StringList& varName)
28512852
consumeCallOffset(); // return-value adjustment
28522853
oldTopLevel = m_topLevel;
28532854
m_topLevel = false;
2854-
DemangledTypeNode t = DemangleSymbol(name);
2855+
DemangledTypeNode t = DemangleSymbol(name, simplifyTemplates);
28552856
m_topLevel = oldTopLevel;
28562857
return DemangledTypeNode::NamedType(UnknownNamedTypeClass,
28572858
StringList{"covariant_return_thunk_to_" + JoinNameSegments(name) + t.GetStringAfterName(m_platform.GetPtr())});
@@ -2879,7 +2880,7 @@ DemangledTypeNode DemangleGNU3::DemangleSymbol(StringList& varName)
28792880
throw DemangleException();
28802881
oldTopLevel = m_topLevel;
28812882
m_topLevel = false;
2882-
DemangledTypeNode t = DemangleSymbol(name);
2883+
DemangledTypeNode t = DemangleSymbol(name, simplifyTemplates);
28832884
m_topLevel = oldTopLevel;
28842885
return DemangledTypeNode::NamedType(UnknownNamedTypeClass,
28852886
StringList{"non-virtual_thunk_to_" + JoinNameSegments(name) + t.GetStringAfterName(m_platform.GetPtr())});
@@ -2888,7 +2889,7 @@ DemangledTypeNode DemangleGNU3::DemangleSymbol(StringList& varName)
28882889
{
28892890
oldTopLevel = m_topLevel;
28902891
m_topLevel = false;
2891-
DemangledTypeNode t = DemangleSymbol(name);
2892+
DemangledTypeNode t = DemangleSymbol(name, simplifyTemplates);
28922893
m_topLevel = oldTopLevel;
28932894
return DemangledTypeNode::NamedType(UnknownNamedTypeClass,
28942895
StringList{"tls_init_function_for_" + t.GetTypeAndName(name, m_platform.GetPtr())});
@@ -2922,7 +2923,7 @@ DemangledTypeNode DemangleGNU3::DemangleSymbol(StringList& varName)
29222923
throw DemangleException();
29232924
oldTopLevel = m_topLevel;
29242925
m_topLevel = false;
2925-
DemangledTypeNode t = DemangleSymbol(name);
2926+
DemangledTypeNode t = DemangleSymbol(name, simplifyTemplates);
29262927
m_topLevel = oldTopLevel;
29272928
return DemangledTypeNode::NamedType(UnknownNamedTypeClass,
29282929
StringList{"virtual_thunk_to_" + JoinNameSegments(name) + t.GetStringAfterName(m_platform.GetPtr())});
@@ -2934,7 +2935,7 @@ DemangledTypeNode DemangleGNU3::DemangleSymbol(StringList& varName)
29342935
{
29352936
oldTopLevel = m_topLevel;
29362937
m_topLevel = false;
2937-
DemangledTypeNode t = DemangleSymbol(name);
2938+
DemangledTypeNode t = DemangleSymbol(name, simplifyTemplates);
29382939
m_topLevel = oldTopLevel;
29392940
return DemangledTypeNode::NamedType(UnknownNamedTypeClass,
29402941
StringList{"tls_wrapper_function_for_" + t.GetTypeAndName(name, m_platform.GetPtr())});
@@ -2978,6 +2979,8 @@ DemangledTypeNode DemangleGNU3::DemangleSymbol(StringList& varName)
29782979
ExtendTypeName(type, "[abi:" + abiTag + "]");
29792980
}
29802981
const bool nameRequiresReturnType = m_isParameter || LastTypeNameSegmentHasTemplateArguments(type);
2982+
if (simplifyTemplates)
2983+
DemangledTemplateSimplifier::SimplifyTypeNodeInPlace(type);
29812984
varName = type.RenderTypeNameSegments(m_platform.GetPtr());
29822985
if (m_isOperatorOverload ||
29832986
type.GetNameType() == ConstructorNameType ||
@@ -3064,6 +3067,8 @@ DemangledTypeNode DemangleGNU3::DemangleSymbol(StringList& varName)
30643067
type.SetVolatile(vltl);
30653068
if (rstrct)
30663069
type.SetPointerSuffixBits(1u << RestrictSuffix);
3070+
if (simplifyTemplates)
3071+
DemangledTemplateSimplifier::SimplifyTypeNodeInPlace(type);
30673072

30683073
// PrintTables();
30693074
MyLogDebug("Done: %s%s%s\n", type.GetStringBeforeName(m_platform.GetPtr()).c_str(), JoinNameSegments(varName).c_str(),
@@ -3126,7 +3131,8 @@ bool DemangleGNU3Static::DemangleGlobalHeader(string& name, string& header)
31263131
namespace
31273132
{
31283133
static bool DemangleStringGNU3Segments(
3129-
Platform* platform, const string& name, Ref<Type>& outType, StringList& outVarName)
3134+
Platform* platform, const string& name, Ref<Type>& outType, StringList& outVarName,
3135+
bool simplifyTemplates = false)
31303136
{
31313137
// Handle _block_invoke[.N] and _block_invoke_N suffixes (Clang/Apple block invocations).
31323138
// E.g. ____ZN4dyld5_mainEPK12macho_headermiPPKcS5_S5_Pm_block_invoke.110
@@ -3156,7 +3162,7 @@ namespace
31563162
string normalized = "_" + base.substr(zPos);
31573163
Ref<Type> baseType;
31583164
StringList baseName;
3159-
if (DemangleStringGNU3Segments(platform, normalized, baseType, baseName))
3165+
if (DemangleStringGNU3Segments(platform, normalized, baseType, baseName, simplifyTemplates))
31603166
{
31613167
outVarName.clear();
31623168
outVarName.push_back("invocation_function_for_block_in_" + JoinNameSegments(baseName));
@@ -3176,7 +3182,7 @@ namespace
31763182
string base = name.substr(0, name.size() - tlvInitSuffix.size());
31773183
Ref<Type> baseType;
31783184
StringList baseName;
3179-
if (DemangleStringGNU3Segments(platform, base, baseType, baseName))
3185+
if (DemangleStringGNU3Segments(platform, base, baseType, baseName, simplifyTemplates))
31803186
{
31813187
outVarName = std::move(baseName);
31823188
if (outVarName.size() > 0)
@@ -3211,7 +3217,10 @@ namespace
32113217
demangle.Reset(platform, encoding);
32123218
try
32133219
{
3214-
outType = demangle.DemangleSymbol(outVarName).Finalize(platform);
3220+
DemangledTypeNode type = demangle.DemangleSymbol(outVarName, simplifyTemplates);
3221+
if (simplifyTemplates)
3222+
DemangledTemplateSimplifier::SimplifyTypeNodeInPlace(type);
3223+
outType = type.Finalize(platform);
32153224

32163225
if (outVarName.size() == 0)
32173226
{
@@ -3243,23 +3252,23 @@ namespace
32433252

32443253

32453254
bool DemangleGNU3Static::DemangleStringGNU3(Platform* platform, const string& name, Ref<Type>& outType,
3246-
QualifiedName& outVarName)
3255+
QualifiedName& outVarName, bool simplifyTemplates)
32473256
{
32483257
StringList outVarNameSegments;
3249-
if (!DemangleStringGNU3Segments(platform, name, outType, outVarNameSegments))
3258+
if (!DemangleStringGNU3Segments(platform, name, outType, outVarNameSegments, simplifyTemplates))
32503259
return false;
32513260
outVarName = QualifiedName(outVarNameSegments);
32523261
return true;
32533262
}
32543263

32553264

32563265
bool DemangleGNU3Static::DemangleStringGNU3(Architecture* arch, const string& name, Ref<Type>& outType,
3257-
QualifiedName& outVarName)
3266+
QualifiedName& outVarName, bool simplifyTemplates)
32583267
{
32593268
Ref<Platform> platform;
32603269
if (arch)
32613270
platform = arch->GetStandalonePlatform();
3262-
return DemangleStringGNU3(platform.GetPtr(), name, outType, outVarName);
3271+
return DemangleStringGNU3(platform.GetPtr(), name, outType, outVarName, simplifyTemplates);
32633272
}
32643273

32653274

@@ -3301,6 +3310,20 @@ class GNU3Demangler: public Demangler
33013310
}
33023311
return DemangleGNU3Static::DemangleStringGNU3(arch, name, outType, outVarName);
33033312
}
3313+
3314+
#ifdef BINARYNINJACORE_LIBRARY
3315+
virtual bool DemangleWithOptions(Architecture* arch, const string& name, Ref<Type>& outType,
3316+
QualifiedName& outVarName, BinaryView* view, bool simplify) override
3317+
{
3318+
if (view)
3319+
{
3320+
auto platform = view->GetDefaultPlatform();
3321+
if (platform)
3322+
return DemangleGNU3Static::DemangleStringGNU3(platform, name, outType, outVarName, simplify);
3323+
}
3324+
return DemangleGNU3Static::DemangleStringGNU3(arch, name, outType, outVarName, simplify);
3325+
}
3326+
#endif
33043327
};
33053328

33063329

demangler/gnu3/demangle_gnu3.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ class DemangleGNU3
186186
public:
187187
DemangleGNU3(BN::Platform* platform, const _STD_STRING& mangledName);
188188
void Reset(BN::Platform* platform, const _STD_STRING& mangledName);
189-
DemangledTypeNode DemangleSymbol(StringList& varName);
189+
DemangledTypeNode DemangleSymbol(StringList& varName, bool simplifyTemplates = false);
190190
};
191191

192192

@@ -196,6 +196,8 @@ class DemangleGNU3Static
196196
static bool IsGNU3MangledString(const _STD_STRING& name);
197197
static bool DemangleGlobalHeader(_STD_STRING& name, _STD_STRING& header);
198198

199-
static bool DemangleStringGNU3(BN::Platform* platform, const _STD_STRING& name, BN::Ref<BN::Type>& outType, BN::QualifiedName& outVarName);
200-
static bool DemangleStringGNU3(BN::Architecture* arch, const _STD_STRING& name, BN::Ref<BN::Type>& outType, BN::QualifiedName& outVarName);
199+
static bool DemangleStringGNU3(BN::Platform* platform, const _STD_STRING& name, BN::Ref<BN::Type>& outType,
200+
BN::QualifiedName& outVarName, bool simplifyTemplates = false);
201+
static bool DemangleStringGNU3(BN::Architecture* arch, const _STD_STRING& name, BN::Ref<BN::Type>& outType,
202+
BN::QualifiedName& outVarName, bool simplifyTemplates = false);
201203
};

0 commit comments

Comments
 (0)