diff options
author | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2015-11-21 12:36:51 +0000 |
---|---|---|
committer | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2015-11-21 12:36:51 +0000 |
commit | 3d4a72e981aca7cc253475f608ba16f75d1624f9 (patch) | |
tree | b9d109a9dd0484925a84932f5cb5cd6d7c252ba7 /compiler/hlcgobj.pas | |
parent | 692b244db27f4a303eabba8097402d81a3d4dec9 (diff) | |
download | fpc-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.pas | 53 |
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 : |