mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-04 20:19:29 +01:00
+ ttgobj.gethltemptyped() routine for allocating managed types with high level
code generator support * refactored some internal temp generator code git-svn-id: branches/jvmbackend@18681 -
This commit is contained in:
parent
085d0efead
commit
cef61300ff
@ -46,6 +46,7 @@ unit tgcpu;
|
|||||||
procedure setfirsttemp(l : longint); override;
|
procedure setfirsttemp(l : longint); override;
|
||||||
procedure getlocal(list: TAsmList; size: longint; alignment: shortint; def: tdef; var ref: treference); override;
|
procedure getlocal(list: TAsmList; size: longint; alignment: shortint; def: tdef; var ref: treference); override;
|
||||||
procedure gethltemp(list: TAsmList; def: tdef; forcesize: aint; temptype: ttemptype; out ref: treference); override;
|
procedure gethltemp(list: TAsmList; def: tdef; forcesize: aint; temptype: ttemptype; out ref: treference); override;
|
||||||
|
procedure gethltemptyped(list: TAsmList; def: tdef; temptype: ttemptype; out ref: treference); override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -234,6 +235,11 @@ unit tgcpu;
|
|||||||
inherited;
|
inherited;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure ttgjvm.gethltemptyped(list: TAsmList; def: tdef; temptype: ttemptype; out ref: treference);
|
||||||
|
begin
|
||||||
|
gethltemp(list,def,def.size,temptype,ref);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
tgobjclass:=ttgjvm;
|
tgobjclass:=ttgjvm;
|
||||||
|
|||||||
@ -403,7 +403,7 @@ interface
|
|||||||
if is_managed_type(tempinfo^.typedef) then
|
if is_managed_type(tempinfo^.typedef) then
|
||||||
begin
|
begin
|
||||||
location_reset_ref(tempinfo^.location,LOC_REFERENCE,def_cgsize(tempinfo^.typedef),0);
|
location_reset_ref(tempinfo^.location,LOC_REFERENCE,def_cgsize(tempinfo^.typedef),0);
|
||||||
tg.GetTempTyped(current_asmdata.CurrAsmList,tempinfo^.typedef,tempinfo^.temptype,tempinfo^.location.reference);
|
tg.gethltemptyped(current_asmdata.CurrAsmList,tempinfo^.typedef,tempinfo^.temptype,tempinfo^.location.reference);
|
||||||
{ the temp could have been used previously either because the memory location was reused or
|
{ the temp could have been used previously either because the memory location was reused or
|
||||||
because we're in a loop }
|
because we're in a loop }
|
||||||
hlcg.g_finalize(current_asmdata.CurrAsmList,tempinfo^.typedef,tempinfo^.location.reference);
|
hlcg.g_finalize(current_asmdata.CurrAsmList,tempinfo^.typedef,tempinfo^.location.reference);
|
||||||
|
|||||||
@ -61,6 +61,7 @@ unit tgobj;
|
|||||||
tempfreelist : ptemprecord;
|
tempfreelist : ptemprecord;
|
||||||
function alloctemp(list: TAsmList; size,alignment : longint; temptype : ttemptype; def:tdef) : longint; virtual;
|
function alloctemp(list: TAsmList; size,alignment : longint; temptype : ttemptype; def:tdef) : longint; virtual;
|
||||||
procedure freetemp(list: TAsmList; pos:longint;temptypes:ttemptypeset);
|
procedure freetemp(list: TAsmList; pos:longint;temptypes:ttemptypeset);
|
||||||
|
procedure gettempinternal(list: TAsmList; size, alignment : longint;temptype:ttemptype;def: tdef;out ref : treference);
|
||||||
public
|
public
|
||||||
{ contains all temps }
|
{ contains all temps }
|
||||||
templist : ptemprecord;
|
templist : ptemprecord;
|
||||||
@ -87,6 +88,7 @@ unit tgobj;
|
|||||||
the forcesize parameter is so that it can be used for defs that
|
the forcesize parameter is so that it can be used for defs that
|
||||||
don't have an inherent size (e.g., array of const) }
|
don't have an inherent size (e.g., array of const) }
|
||||||
procedure gethltemp(list: TAsmList; def: tdef; forcesize: aint; temptype: ttemptype; out ref: treference); virtual;
|
procedure gethltemp(list: TAsmList; def: tdef; forcesize: aint; temptype: ttemptype; out ref: treference); virtual;
|
||||||
|
procedure gethltemptyped(list: TAsmList; def: tdef; temptype: ttemptype; out ref: treference); virtual;
|
||||||
procedure gettemp(list: TAsmList; size, alignment : longint;temptype:ttemptype;out ref : treference);
|
procedure gettemp(list: TAsmList; size, alignment : longint;temptype:ttemptype;out ref : treference);
|
||||||
procedure gettemptyped(list: TAsmList; def:tdef;temptype:ttemptype;out ref : treference);
|
procedure gettemptyped(list: TAsmList; def:tdef;temptype:ttemptype;out ref : treference);
|
||||||
procedure ungettemp(list: TAsmList; const ref : treference);
|
procedure ungettemp(list: TAsmList; const ref : treference);
|
||||||
@ -508,7 +510,20 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure ttgobj.gethltemptyped(list: TAsmList; def: tdef; temptype: ttemptype; out ref: treference);
|
||||||
|
begin
|
||||||
|
gettemptyped(list,def,temptype,ref);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
procedure ttgobj.gettemp(list: TAsmList; size, alignment : longint;temptype:ttemptype;out ref : treference);
|
procedure ttgobj.gettemp(list: TAsmList; size, alignment : longint;temptype:ttemptype;out ref : treference);
|
||||||
|
begin
|
||||||
|
gettempinternal(list,size,alignment,temptype,nil,ref);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure ttgobj.gettempinternal(list: TAsmList; size, alignment : longint;temptype:ttemptype;def: tdef;out ref : treference);
|
||||||
var
|
var
|
||||||
varalign : shortint;
|
varalign : shortint;
|
||||||
begin
|
begin
|
||||||
@ -517,23 +532,14 @@ implementation
|
|||||||
on cgobj (PFV) }
|
on cgobj (PFV) }
|
||||||
fillchar(ref,sizeof(ref),0);
|
fillchar(ref,sizeof(ref),0);
|
||||||
ref.base:=current_procinfo.framepointer;
|
ref.base:=current_procinfo.framepointer;
|
||||||
ref.offset:=alloctemp(list,size,varalign,temptype,nil);
|
ref.offset:=alloctemp(list,size,varalign,temptype,def);
|
||||||
ref.alignment:=varalign;
|
ref.alignment:=varalign;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure ttgobj.gettemptyped(list: TAsmList; def:tdef;temptype:ttemptype;out ref : treference);
|
procedure ttgobj.gettemptyped(list: TAsmList; def:tdef;temptype:ttemptype;out ref : treference);
|
||||||
var
|
|
||||||
varalign : shortint;
|
|
||||||
begin
|
begin
|
||||||
varalign:=def.alignment;
|
gettempinternal(list,def.size,def.alignment,temptype,def,ref);
|
||||||
varalign:=used_align(varalign,current_settings.alignment.localalignmin,current_settings.alignment.localalignmax);
|
|
||||||
{ can't use reference_reset_base, because that will let tgobj depend
|
|
||||||
on cgobj (PFV) }
|
|
||||||
fillchar(ref,sizeof(ref),0);
|
|
||||||
ref.base:=current_procinfo.framepointer;
|
|
||||||
ref.offset:=alloctemp(list,def.size,varalign,temptype,def);
|
|
||||||
ref.alignment:=varalign;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user