MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / DemangleFunction

Method DemangleFunction

demangler/msvc/demangle_msvc.cpp:1495–1631  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1493
1494
1495TypeBuilder Demangle::DemangleFunction(BNNameType classFunctionType, bool pointerSuffix, BackrefList& nameBackrefList, int funcClass)
1496{
1497 m_logger->LogDebug("%s: '%s'\n", __FUNCTION__, reader.GetRaw());
1498 bool _const = false, _volatile = false, isMember = false;
1499 set<BNPointerSuffix> suffix;
1500 TypeBuilder returnType;
1501 BNCallingConventionName cc;
1502
1503 //Demangle adjustor which we don't do anything with for now
1504 if ((funcClass & StaticThunkFunctionClass) == StaticThunkFunctionClass)
1505 {
1506 int64_t adjustor;
1507 DemangleNumber(adjustor);
1508 m_varName.back() += "`adjustor{" + to_string(adjustor) + "}'";
1509 }
1510 else if ((funcClass & VirtualThunkFunctionClass) == VirtualThunkFunctionClass)
1511 {
1512 if ((funcClass & VirtualThunkExFunctionClass) == VirtualThunkExFunctionClass)
1513 {
1514 int64_t vbptrOffset;
1515 int64_t vbOffsetOffset;
1516 int64_t vtorDispOffset;
1517 int64_t staticOffset;
1518 DemangleNumber(vbptrOffset);
1519 DemangleNumber(vbOffsetOffset);
1520 DemangleNumber(vtorDispOffset);
1521 DemangleNumber(staticOffset);
1522 m_varName.back() += "`vtordispex{" + to_string(vbptrOffset) + ", " + to_string(vbOffsetOffset) + ", " + to_string(vtorDispOffset) + ", " + to_string(staticOffset) + "}'";
1523 }
1524 else
1525 {
1526 int64_t vtorDispOffset;
1527 int64_t staticOffset;
1528 DemangleNumber(vtorDispOffset);
1529 DemangleNumber(staticOffset);
1530 m_varName.back() += "`vtordisp{" + to_string(vtorDispOffset) + ", " + to_string(staticOffset) + "}'";
1531 }
1532 }
1533
1534 if (pointerSuffix)
1535 {
1536 suffix = DemanglePointerSuffix();
1537 DemangleModifiers(_const, _volatile, isMember);
1538 }
1539 if (reader.Peek() == '?')
1540 reader.Consume();
1541 cc = DemangleCallingConvention();
1542 bool shouldHaveReturnType = true;
1543 if (reader.Peek() == '@')
1544 {
1545 //No return type
1546 shouldHaveReturnType = false;
1547 reader.Consume();
1548 m_logger->LogDebug("Function has no return type %s", reader.GetRaw());
1549 }
1550 else
1551 {
1552 //Demangle function return type

Callers

nothing calls this directly

Calls 15

PointerTypeClass · 0.85
VoidTypeClass · 0.85
LogDebugMethod · 0.80
IndentMethod · 0.80
c_strMethod · 0.80
DedentMethod · 0.80
eraseMethod · 0.80
push_backMethod · 0.80
GetClassMethod · 0.80
SetCallingConventionMethod · 0.80
FunctionParameterClass · 0.50
FunctionTypeClass · 0.50

Tested by

no test coverage detected