+ added type parentfpvoidpointertype, which is a void pointer with the same size

as the hidden parentfp parameter, passed to nested procs. On i8086 it is
  always a near pointer, unlike voidpointer (which changes according to the
  memory model). This fixes nested procs in i8086 far data memory models.

git-svn-id: trunk@26934 -
This commit is contained in:
nickysn 2014-03-02 22:55:52 +00:00
parent 9321d9916d
commit 2908fa9123
5 changed files with 11 additions and 3 deletions

View File

@ -164,7 +164,7 @@ implementation
hsym:=tparavarsym(currpi.procdef.parast.Find('parentfp'));
if not assigned(hsym) then
internalerror(200309281);
hlcg.a_load_loc_reg(current_asmdata.CurrAsmList,voidpointertype,voidpointertype,hsym.localloc,location.register);
hlcg.a_load_loc_reg(current_asmdata.CurrAsmList,parentfpvoidpointertype,parentfpvoidpointertype,hsym.localloc,location.register);
{ walk parents }
while (currpi.procdef.owner.symtablelevel>parentpd.parast.symtablelevel) do
begin

View File

@ -367,7 +367,7 @@ implementation
{$endif dummy}
begin
result:=nil;
resultdef:=voidpointertype;
resultdef:=parentfpvoidpointertype;
{$ifdef dummy}
{ currently parentfps are never loaded in registers (FK) }
if (current_procinfo.procdef.parast.symtablelevel<>parentpd.parast.symtablelevel) then

View File

@ -119,7 +119,7 @@ implementation
(pd.owner.defowner.typ<>procdef) then
begin
vs:=tparavarsym.create('$parentfp',paranr,vs_value
,voidpointertype,[vo_is_parentfp,vo_is_hidden_para]);
,parentfpvoidpointertype,[vo_is_parentfp,vo_is_hidden_para]);
vs.varregable:=vr_none;
end
else

View File

@ -273,6 +273,11 @@ implementation
voidpointertype:=tpointerdef.create(voidtype);
charpointertype:=tpointerdef.create(cansichartype);
widecharpointertype:=tpointerdef.create(cwidechartype);
{$ifdef i8086}
parentfpvoidpointertype:=tpointerdef.createx86(voidtype,x86pt_near);
{$else i8086}
parentfpvoidpointertype:=tpointerdef.create(voidtype);
{$endif i8086}
{$ifdef x86}
voidnearpointertype:=tpointerdef.createx86(voidtype,x86pt_near);
voidnearcspointertype:=tpointerdef.createx86(voidtype,x86pt_near_cs);
@ -410,6 +415,7 @@ implementation
addtype('$void_pointer',voidpointertype);
addtype('$char_pointer',charpointertype);
addtype('$widechar_pointer',widecharpointertype);
addtype('$parentfp_void_pointer',parentfpvoidpointertype);
{$ifdef x86}
addtype('$void_nearpointer',voidnearpointertype);
addtype('$void_nearcspointer',voidnearcspointertype);
@ -545,6 +551,7 @@ implementation
loadtype('void_pointer',voidpointertype);
loadtype('char_pointer',charpointertype);
loadtype('widechar_pointer',widecharpointertype);
loadtype('parentfp_void_pointer',parentfpvoidpointertype);
{$ifdef x86}
loadtype('void_nearpointer',voidnearpointertype);
loadtype('void_nearcspointer',voidnearcspointertype);

View File

@ -885,6 +885,7 @@ interface
voidpointertype, { pointer for Void-pointeddef }
charpointertype, { pointer for Char-pointeddef }
widecharpointertype, { pointer for WideChar-pointeddef }
parentfpvoidpointertype, { void pointer with the size of the hidden parentfp parameter, passed to nested functions }
{$ifdef x86}
voidnearpointertype,
voidnearcspointertype,