* 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:
nickysn 2014-03-28 23:16:14 +00:00
parent 8b2cde4a99
commit 891ab86254
2 changed files with 12 additions and 12 deletions

View File

@ -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

View File

@ -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