summaryrefslogtreecommitdiff
path: root/compiler/hlcgobj.pas
diff options
context:
space:
mode:
authorjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2015-11-21 12:36:51 +0000
committerjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2015-11-21 12:36:51 +0000
commit3d4a72e981aca7cc253475f608ba16f75d1624f9 (patch)
treeb9d109a9dd0484925a84932f5cb5cd6d7c252ba7 /compiler/hlcgobj.pas
parent692b244db27f4a303eabba8097402d81a3d4dec9 (diff)
downloadfpc-3d4a72e981aca7cc253475f608ba16f75d1624f9.tar.gz
- reverted r32315: targets using the high level code generator should keep
complex procvars either in a single "register", or in memory git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@32408 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/hlcgobj.pas')
-rw-r--r--compiler/hlcgobj.pas53
1 files changed, 1 insertions, 52 deletions
diff --git a/compiler/hlcgobj.pas b/compiler/hlcgobj.pas
index d44a789e39..d91bdc1741 100644
--- a/compiler/hlcgobj.pas
+++ b/compiler/hlcgobj.pas
@@ -3964,61 +3964,10 @@ implementation
end;
procedure thlcgobj.location_force_mem(list: TAsmList; var l: tlocation; size: tdef);
-
- procedure location_force_procvardef_mem(const href: treference; const fieldname: TIDString; first_field: boolean);
- var
- fref: treference;
- field: tfieldvarsym;
- begin
- field:=tfieldvarsym(search_struct_member(trecorddef(methodpointertype),fieldname));
- if not assigned(field) then
- internalerror(2015111103);
- fref:=href;
- g_set_addr_nonbitpacked_record_field_ref(list,trecorddef(methodpointertype),field,fref);
- case l.loc of
- LOC_CONSTANT:
- begin
- { in this case, the constant needs to be loaded in both the
- high and low location }
- hlcg.a_load_const_ref(list,field.vardef,l.value,fref);
- end;
- LOC_REGISTER,LOC_CREGISTER:
- begin
- if (target_info.endian=endian_little)=first_field then
- hlcg.a_load_reg_ref(list,cprocvardef.getreusableprocaddr(tprocvardef(size)),field.vardef,l.register,fref)
- else
- hlcg.a_load_reg_ref(list,cprocvardef.getreusableprocaddr(tprocvardef(size)),field.vardef,l.registerhi,fref)
- end;
- else
- internalerror(2015111105);
- end;
- end;
-
var
- r, href: treference;
+ r : treference;
forcesize: aint;
begin
- { on the JVM target, all procvars are represented by a class, so they
- don't take up more than one register -> use regular code there }
- if (size.typ=procvardef) and
- not tprocvardef(size).is_addressonly and
- not(target_info.system in systems_managed_vm) then
- begin
- if l.loc in [LOC_REFERENCE,LOC_CREFERENCE] then
- exit;
-
- tg.gethltemp(list,size,size.size,tt_normal,r);
- href:=r;
- g_ptrtypecast_ref(list,cpointerdef.getreusable(size),cpointerdef.getreusable(methodpointertype),href);
-
- location_force_procvardef_mem(href,'proc',true);
- location_force_procvardef_mem(href,'self',false);
-
- location_reset_ref(l,LOC_REFERENCE,l.size,r.alignment);
- l.reference:=r;
- exit;
- end;
-
case l.loc of
LOC_FPUREGISTER,
LOC_CFPUREGISTER :