Microsoft likes to call these decorated names, to each their own. Here is what I’ve gleaned so far, use at your own risk. In particular, this has changed before (going to MSVC 4), and could quite possibly change in the future.
stdcall: ?funcName @@YG retType params-list Z cdecl: ?funcName @@YA retType params-list Z thiscall: ?methodName @ className @@AAE retType param-list Z static method call: ?methodName @ className @@CA retType param-list Z
If there are parameters, param-list is a list of them, followed by a @. Otherwise, param-list is X (void), with no @ afterwards.
Basic types:
| D is char | int8 |
| E is unsigned char | uint8 |
| F is short | int16 |
| G is unsigned short | uint16 |
| H is int | int32 |
| I is unsigned int | uint32 |
| J is long | int32 |
| K is unsigned long | uint32 |
| M is float | float32 |
| N is double | float64 |
| X is void | |
| _J is int 64 | int64 |
| _K is unsigned int 64 | uint64 |
| _N is bool |
Pointers:
- PA prefixes a type to indicate a pointer
- PB prefixes a type to indicate a const pointer
Note: volatile is not represented in the mangled/decorated name
Structures: UstructName@@ is structName a pointer to a struct occurs as PA or PB followed by a U... Udigit@ Constructing reference to the previous digit-th U definition (1 based). In other words, it creates a new definition that can be referenced later on as well. digit Reference to the previous digit-th U definition (0 based!!!)
For structures, a PAUname@@ will be referenced as 0 in other parameters of the form name *, but the first parameter of the form name will appear as U1@ and subsequently as 1.
The converse is having a Uname@@ first, and then parameters of the form name * will appear first as PAU1@ and subsequently as 1, and parameters of the form name as 0.
Note: 0 and 1 in these two examples are the positions of the first Ux@@ and first Uy@ declarations, they could be 2 and 4 if there were two decls before the first, and one decl in between.