The rules for mangled names for routines are as follows:
- All routine names are converted to upper case.
- Routines in a unit have their unit name prepended to them : _UNITNAME$$_
- All Routines in the main program have a _ prepended to them.
- All parameters in a routine are mangled using the type of the parameter (in uppercase)
prepended by the $ character. This is done in left to right order for each parameter of
the routine.
- Objects and classes use special mangling : The class type or object type is given in
the mangled name; The mangled name is as follows: _$$_TYPEDECL_$$ optionally
preceded by mangled name of the unit and finishing with the method name.
- Do not use public names that start with FPC_, because FPC uses these for internal
system routines and constants.
The following constructs
unit testman;
interface
type
myobject = object
constructor init;
procedure mymethod;
end;
implementation
constructor myobject.init;
begin
end;
procedure myobject.mymethod;
begin
end;
function myfunc: pointer;
begin
end;
procedure myprocedure(var x: integer; y: longint; z : pchar);
begin
end;
end.
will result in the following assembler file for the Intel 80x86 target:
.file "testman.pas"
.text
.balign 16
.globl _TESTMAN$$_$$_MYOBJECT_$$_INIT
_TESTMAN$$_$$_MYOBJECT_$$_INIT:
pushl %ebp
movl %esp,%ebp
subl $4,%esp
movl $0,%edi
call FPC_HELP_CONSTRUCTOR
jz .L5
jmp .L7
.L5:
movl 12(%ebp),%esi
movl $0,%edi
call FPC_HELP_FAIL
.L7:
movl %esi,%eax
testl %esi,%esi
leave
ret $8
.balign 16
.globl _TESTMAN$$_$$_MYOBJECT_$$_MYMETHOD
_TESTMAN$$_$$_MYOBJECT_$$_MYMETHOD:
pushl %ebp
movl %esp,%ebp
leave
ret $4
.balign 16
_TESTMAN$$_MYFUNC:
pushl %ebp
movl %esp,%ebp
subl $4,%esp
movl -4(%ebp),%eax
leave
ret
.balign 16
_TESTMAN$$_MYPROCEDURE$INTEGER$LONGINT$PCHAR:
pushl %ebp
movl %esp,%ebp
leave
ret $12