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)
31263131namespace
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
32453254bool 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
32563265bool 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
0 commit comments