* 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');
paramanager.getintparaloc(pd,1,cgpara1);
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
begin
a_load_reg_cgpara(list,OS_ADDR,reg,cgpara1);

View File

@ -1251,7 +1251,7 @@ implementation
{ send the vmt parameter }
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);
cg.a_loadaddr_ref_cgpara(current_asmdata.CurrAsmList,href2,paraloc1);
paramanager.freecgpara(current_asmdata.CurrAsmList,paraloc1);

View File

@ -215,7 +215,7 @@ implementation
if left.nodetype=typen then
begin
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);
end
else

View File

@ -109,7 +109,7 @@ implementation
if not is_objcclass(left.resultdef) then
begin
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));
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,location.register);
end

View File

@ -752,7 +752,7 @@ function get_next_varsym(def: tabstractrecorddef; const SymList:TFPHashObjectLis
begin
if not Tobjectdef(tclassrefdef(node.resultdef).pointeddef).is_related(tobjectdef(def.pointeddef)) then
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;
niln:
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
begin
list.concat(Tai_const.createname(
tobjectdef(tinlinenode(node).left.resultdef).vmt_mangledname,0));
tobjectdef(tinlinenode(node).left.resultdef).vmt_mangledname,AT_DATA,0));
end
else
Message(parser_e_illegal_expression);
@ -1627,7 +1627,7 @@ function get_next_varsym(def: tabstractrecorddef; const SymList:TFPHashObjectLis
begin
for i:=1 to def.vmt_offset-objoffset do
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 }
objoffset:=def.vmt_offset + sizeof(pint);
vmtwritten:=true;
@ -1656,7 +1656,7 @@ function get_next_varsym(def: tabstractrecorddef; const SymList:TFPHashObjectLis
begin
for i:=1 to def.vmt_offset-objoffset do
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 }
objoffset:=def.vmt_offset + sizeof(pint);
end;

View File

@ -495,7 +495,7 @@ procedure tx64tryexceptnode.pass_generate_code;
InternalError(2011103101);
{ TODO: make it done without using global label }
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));
cg.a_label(current_asmdata.CurrAsmList,onlabel);
secondpass(hnode);