* specify AT_DATA in all references to the tobjectdef.vmt_mangledname symbol.

This fixes a lot of bugs, related to objects and classes in the i8086 medium
  memory model

git-svn-id: trunk@25794 -
This commit is contained in:
nickysn 2013-10-15 18:56:27 +00:00
parent 9b2b5a9565
commit bf07fc077b
6 changed files with 9 additions and 9 deletions

View File

@ -2135,7 +2135,7 @@ implementation
pd:=search_system_proc('fpc_check_object_ext'); pd:=search_system_proc('fpc_check_object_ext');
paramanager.getintparaloc(pd,1,cgpara1); paramanager.getintparaloc(pd,1,cgpara1);
paramanager.getintparaloc(pd,2,cgpara2); paramanager.getintparaloc(pd,2,cgpara2);
reference_reset_symbol(hrefvmt,current_asmdata.RefAsmSymbol(objdef.vmt_mangledname),0,sizeof(pint)); reference_reset_symbol(hrefvmt,current_asmdata.RefAsmSymbol(objdef.vmt_mangledname,AT_DATA),0,sizeof(pint));
if pd.is_pushleftright then if pd.is_pushleftright then
begin begin
a_load_reg_cgpara(list,OS_ADDR,reg,cgpara1); a_load_reg_cgpara(list,OS_ADDR,reg,cgpara1);

View File

@ -1251,7 +1251,7 @@ implementation
{ send the vmt parameter } { send the vmt parameter }
pd:=search_system_proc('fpc_catches'); pd:=search_system_proc('fpc_catches');
reference_reset_symbol(href2,current_asmdata.RefAsmSymbol(excepttype.vmt_mangledname),0,sizeof(pint)); reference_reset_symbol(href2,current_asmdata.RefAsmSymbol(excepttype.vmt_mangledname,AT_DATA),0,sizeof(pint));
paramanager.getintparaloc(pd,1,paraloc1); paramanager.getintparaloc(pd,1,paraloc1);
cg.a_loadaddr_ref_cgpara(current_asmdata.CurrAsmList,href2,paraloc1); cg.a_loadaddr_ref_cgpara(current_asmdata.CurrAsmList,href2,paraloc1);
paramanager.freecgpara(current_asmdata.CurrAsmList,paraloc1); paramanager.freecgpara(current_asmdata.CurrAsmList,paraloc1);

View File

@ -215,7 +215,7 @@ implementation
if left.nodetype=typen then if left.nodetype=typen then
begin begin
hregister:=cg.getaddressregister(current_asmdata.CurrAsmList); hregister:=cg.getaddressregister(current_asmdata.CurrAsmList);
reference_reset_symbol(href,current_asmdata.RefAsmSymbol(tobjectdef(left.resultdef).vmt_mangledname),0,sizeof(pint)); reference_reset_symbol(href,current_asmdata.RefAsmSymbol(tobjectdef(left.resultdef).vmt_mangledname,AT_DATA),0,sizeof(pint));
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,hregister); cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,hregister);
end end
else else

View File

@ -109,7 +109,7 @@ implementation
if not is_objcclass(left.resultdef) then if not is_objcclass(left.resultdef) then
begin begin
reference_reset_symbol(href, reference_reset_symbol(href,
current_asmdata.RefAsmSymbol(tobjectdef(tclassrefdef(resultdef).pointeddef).vmt_mangledname),0, current_asmdata.RefAsmSymbol(tobjectdef(tclassrefdef(resultdef).pointeddef).vmt_mangledname,AT_DATA),0,
sizeof(pint)); sizeof(pint));
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,location.register); cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,location.register);
end end

View File

@ -752,7 +752,7 @@ function get_next_varsym(def: tabstractrecorddef; const SymList:TFPHashObjectLis
begin begin
if not Tobjectdef(tclassrefdef(node.resultdef).pointeddef).is_related(tobjectdef(def.pointeddef)) then if not Tobjectdef(tclassrefdef(node.resultdef).pointeddef).is_related(tobjectdef(def.pointeddef)) then
IncompatibleTypes(node.resultdef, def); IncompatibleTypes(node.resultdef, def);
list.concat(Tai_const.Create_sym(current_asmdata.RefAsmSymbol(Tobjectdef(tclassrefdef(node.resultdef).pointeddef).vmt_mangledname))); list.concat(Tai_const.Create_sym(current_asmdata.RefAsmSymbol(Tobjectdef(tclassrefdef(node.resultdef).pointeddef).vmt_mangledname,AT_DATA)));
end; end;
niln: niln:
list.concat(Tai_const.Create_sym(nil)); list.concat(Tai_const.Create_sym(nil));
@ -977,7 +977,7 @@ function get_next_varsym(def: tabstractrecorddef; const SymList:TFPHashObjectLis
if (tinlinenode(node).left.nodetype=typen) then if (tinlinenode(node).left.nodetype=typen) then
begin begin
list.concat(Tai_const.createname( list.concat(Tai_const.createname(
tobjectdef(tinlinenode(node).left.resultdef).vmt_mangledname,0)); tobjectdef(tinlinenode(node).left.resultdef).vmt_mangledname,AT_DATA,0));
end end
else else
Message(parser_e_illegal_expression); Message(parser_e_illegal_expression);
@ -1627,7 +1627,7 @@ function get_next_varsym(def: tabstractrecorddef; const SymList:TFPHashObjectLis
begin begin
for i:=1 to def.vmt_offset-objoffset do for i:=1 to def.vmt_offset-objoffset do
list.concat(tai_const.create_8bit(0)); list.concat(tai_const.create_8bit(0));
list.concat(tai_const.createname(def.vmt_mangledname,0)); list.concat(tai_const.createname(def.vmt_mangledname,AT_DATA,0));
{ this is more general } { this is more general }
objoffset:=def.vmt_offset + sizeof(pint); objoffset:=def.vmt_offset + sizeof(pint);
vmtwritten:=true; vmtwritten:=true;
@ -1656,7 +1656,7 @@ function get_next_varsym(def: tabstractrecorddef; const SymList:TFPHashObjectLis
begin begin
for i:=1 to def.vmt_offset-objoffset do for i:=1 to def.vmt_offset-objoffset do
list.concat(tai_const.create_8bit(0)); list.concat(tai_const.create_8bit(0));
list.concat(tai_const.createname(def.vmt_mangledname,0)); list.concat(tai_const.createname(def.vmt_mangledname,AT_DATA,0));
{ this is more general } { this is more general }
objoffset:=def.vmt_offset + sizeof(pint); objoffset:=def.vmt_offset + sizeof(pint);
end; end;

View File

@ -495,7 +495,7 @@ procedure tx64tryexceptnode.pass_generate_code;
InternalError(2011103101); InternalError(2011103101);
{ TODO: make it done without using global label } { TODO: make it done without using global label }
current_asmdata.getglobaljumplabel(onlabel); current_asmdata.getglobaljumplabel(onlabel);
hlist.concat(tai_const.create_rva_sym(current_asmdata.RefAsmSymbol(tonnode(hnode).excepttype.vmt_mangledname))); hlist.concat(tai_const.create_rva_sym(current_asmdata.RefAsmSymbol(tonnode(hnode).excepttype.vmt_mangledname,AT_DATA)));
hlist.concat(tai_const.create_rva_sym(onlabel)); hlist.concat(tai_const.create_rva_sym(onlabel));
cg.a_label(current_asmdata.CurrAsmList,onlabel); cg.a_label(current_asmdata.CurrAsmList,onlabel);
secondpass(hnode); secondpass(hnode);