mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-02 23:27:23 +01:00
* fixed ncgutil.gen_load_vmt_register and tcgloadvmtaddrnode.pass_generate_code
for i8086 far data memory models by using the high level code generator git-svn-id: trunk@27326 -
This commit is contained in:
parent
8b2cde4a99
commit
891ab86254
@ -102,16 +102,16 @@ implementation
|
||||
entry : PHashSetItem;
|
||||
|
||||
begin
|
||||
location_reset(location,LOC_REGISTER,OS_ADDR);
|
||||
location_reset(location,LOC_REGISTER,def_cgsize(voidpointertype));
|
||||
if (left.nodetype=typen) then
|
||||
begin
|
||||
location.register:=cg.getaddressregister(current_asmdata.CurrAsmList);
|
||||
location.register:=hlcg.getaddressregister(current_asmdata.CurrAsmList,voidpointertype);
|
||||
if not is_objcclass(left.resultdef) then
|
||||
begin
|
||||
reference_reset_symbol(href,
|
||||
current_asmdata.RefAsmSymbol(tobjectdef(tclassrefdef(resultdef).pointeddef).vmt_mangledname,AT_DATA),0,
|
||||
sizeof(pint));
|
||||
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,location.register);
|
||||
voidpointertype.size);
|
||||
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,voidpointertype,voidpointertype,href,location.register);
|
||||
end
|
||||
else
|
||||
begin
|
||||
@ -127,8 +127,8 @@ implementation
|
||||
{ find/add necessary classref/classname pool entries }
|
||||
objcfinishstringrefpoolentry(entry,sp_objcclassnames,sec_objc_cls_refs,sec_objc_class_names);
|
||||
end;
|
||||
reference_reset_symbol(href,tasmlabel(entry^.Data),0,sizeof(pint));
|
||||
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,location.register);
|
||||
reference_reset_symbol(href,tasmlabel(entry^.Data),0,voidpointertype.size);
|
||||
hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,voidpointertype,voidpointertype,href,location.register);
|
||||
end;
|
||||
end
|
||||
else
|
||||
|
||||
@ -1900,8 +1900,8 @@ implementation
|
||||
LOC_CREFERENCE,
|
||||
LOC_REFERENCE:
|
||||
begin
|
||||
reference_reset_base(href,cg.getaddressregister(list),objdef.vmt_offset,sizeof(pint));
|
||||
cg.a_loadaddr_ref_reg(list,selfloc.reference,href.base);
|
||||
hlcg.reference_reset_base(href,voidpointertype,hlcg.getaddressregister(list,voidpointertype),objdef.vmt_offset,voidpointertype.size);
|
||||
hlcg.a_loadaddr_ref_reg(list,voidpointertype,voidpointertype,selfloc.reference,href.base);
|
||||
selfdef:=getpointerdef(objdef);
|
||||
end;
|
||||
else
|
||||
@ -1925,7 +1925,7 @@ implementation
|
||||
end
|
||||
else
|
||||
{$endif cpu_uses_separate_address_registers}
|
||||
reference_reset_base(href,selfloc.register,objdef.vmt_offset,sizeof(pint));
|
||||
hlcg.reference_reset_base(href,voidpointertype,selfloc.register,objdef.vmt_offset,voidpointertype.size);
|
||||
end;
|
||||
LOC_CONSTANT,
|
||||
LOC_CREGISTER,
|
||||
@ -1936,7 +1936,7 @@ implementation
|
||||
LOC_CSUBSETREF,
|
||||
LOC_SUBSETREF:
|
||||
begin
|
||||
reference_reset_base(href,cg.getaddressregister(list),objdef.vmt_offset,sizeof(pint));
|
||||
hlcg.reference_reset_base(href,voidpointertype,hlcg.getaddressregister(list,voidpointertype),objdef.vmt_offset,voidpointertype.size);
|
||||
{ todo: pass actual vmt pointer type to hlcg }
|
||||
hlcg.a_load_loc_reg(list,voidpointertype,voidpointertype,selfloc,href.base);
|
||||
end;
|
||||
@ -1944,9 +1944,9 @@ implementation
|
||||
internalerror(200305057);
|
||||
end;
|
||||
end;
|
||||
vmtreg:=cg.getaddressregister(list);
|
||||
vmtreg:=hlcg.getaddressregister(list,voidpointertype);
|
||||
hlcg.g_maybe_testself(list,selfdef,href.base);
|
||||
cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,vmtreg);
|
||||
hlcg.a_load_ref_reg(list,voidpointertype,voidpointertype,href,vmtreg);
|
||||
|
||||
{ test validity of VMT }
|
||||
if not(is_interface(objdef)) and
|
||||
|
||||
Loading…
Reference in New Issue
Block a user