2015-02-19 21:31:24 +02:00
|
|
|
/* radare - LGPL - Copyright 2015 - inisider */
|
|
|
|
|
Add Microsoft C++ demangler
- Contains 20 commits:
- init work of demangler
- add some comments
- add parsing of name, class_name, namespace of objects(class and global)
- refactor
- add parsing of some type codes
- add skeleton of state machine for type code parsing
- add parsing of standard type for type codes state machine
- add parsing of type codes: _{J,K,T,Z,W}
- add parsing of types __m** and union
- add parsing of type codes: _m***, struct *
- add parsing of W type codes: enums...
- refactor getting of namespaces and name variables
- add class type code parsing
- add parsing of long double and bool
- add parsing of X * const volatile
- add parsing of * and & ( Q, R, S, A )
- add parsing of array
- integrate some initial part of microsofr demangler to rabin2
- fix some small bugs
- add parsing of variable storage class and do some small fix
2015-01-17 22:15:20 +02:00
|
|
|
#include "demangler.h"
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#include <r_types.h> // eprintf()
|
|
|
|
|
|
|
|
#include "microsoft_demangle.h"
|
|
|
|
|
|
|
|
typedef enum EManglingType {
|
|
|
|
eManglingMicrosoft = 0,
|
|
|
|
eManglingUnsupported,
|
|
|
|
eManglingUnknown,
|
|
|
|
eManglingTypeMax
|
|
|
|
} EManglingType;
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
static EManglingType get_mangling_type(char *sym)
|
|
|
|
{
|
|
|
|
EManglingType mangling_type = eManglingUnsupported;
|
|
|
|
if (sym == 0) {
|
|
|
|
mangling_type = eManglingUnknown;
|
|
|
|
goto get_mangling_type_err;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (*sym) {
|
|
|
|
case '?':
|
|
|
|
mangling_type = eManglingMicrosoft;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
get_mangling_type_err:
|
|
|
|
return mangling_type;
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
EDemanglerErr create_demangler(SDemangler **demangler)
|
|
|
|
{
|
|
|
|
EDemanglerErr err = eDemanglerErrOK;
|
|
|
|
|
|
|
|
*demangler = (SDemangler *) malloc(sizeof(SDemangler));
|
|
|
|
|
2016-09-19 13:44:47 +01:00
|
|
|
if (!*demangler) {
|
Add Microsoft C++ demangler
- Contains 20 commits:
- init work of demangler
- add some comments
- add parsing of name, class_name, namespace of objects(class and global)
- refactor
- add parsing of some type codes
- add skeleton of state machine for type code parsing
- add parsing of standard type for type codes state machine
- add parsing of type codes: _{J,K,T,Z,W}
- add parsing of types __m** and union
- add parsing of type codes: _m***, struct *
- add parsing of W type codes: enums...
- refactor getting of namespaces and name variables
- add class type code parsing
- add parsing of long double and bool
- add parsing of X * const volatile
- add parsing of * and & ( Q, R, S, A )
- add parsing of array
- integrate some initial part of microsofr demangler to rabin2
- fix some small bugs
- add parsing of variable storage class and do some small fix
2015-01-17 22:15:20 +02:00
|
|
|
err = eDemanglerErrMemoryAllocation;
|
|
|
|
goto create_demagler_err;
|
|
|
|
}
|
|
|
|
|
|
|
|
(*demangler)->demangle = 0;
|
|
|
|
(*demangler)->symbol = 0;
|
|
|
|
|
|
|
|
create_demagler_err:
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
EDemanglerErr init_demangler(SDemangler *demangler, char *sym)
|
|
|
|
{
|
|
|
|
EManglingType mangling_type = eManglingUnsupported;
|
|
|
|
EDemanglerErr err = eDemanglerErrOK;
|
|
|
|
|
|
|
|
// !!! sequence in this array need to be same as in EManglingType enum !!!
|
|
|
|
demangle_func demangle_funcs[] = {
|
|
|
|
microsoft_demangle, // Microsoft demangling function
|
|
|
|
0, // Unsupported demangling
|
|
|
|
0 // Unknown demangling
|
|
|
|
};
|
|
|
|
|
|
|
|
if (demangler == 0) {
|
|
|
|
err = eDemanglerErrMemoryAllocation;
|
|
|
|
goto init_demangler_err;
|
|
|
|
}
|
|
|
|
|
|
|
|
mangling_type = get_mangling_type(sym);
|
|
|
|
switch (mangling_type) {
|
|
|
|
case eManglingUnsupported:
|
|
|
|
err = eDemanglerErrUnsupportedMangling;
|
|
|
|
break;
|
|
|
|
case eManglingUnknown:
|
|
|
|
err = eDemanglerErrUnkown;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (err != eDemanglerErrOK) {
|
|
|
|
goto init_demangler_err;
|
|
|
|
}
|
|
|
|
|
|
|
|
demangler->symbol = strdup(sym);
|
|
|
|
demangler->demangle = demangle_funcs[mangling_type];
|
|
|
|
|
|
|
|
init_demangler_err:
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
void free_demangler(SDemangler *demangler)
|
|
|
|
{
|
|
|
|
R_FREE(demangler->symbol);
|
|
|
|
R_FREE(demangler);
|
|
|
|
}
|