From bf07fc077b042927d7d5d8d361d80d1c11e13f86 Mon Sep 17 00:00:00 2001 From: nickysn Date: Tue, 15 Oct 2013 18:56:27 +0000 Subject: [PATCH] * 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 - --- compiler/cgobj.pas | 2 +- compiler/ncgflw.pas | 2 +- compiler/ncginl.pas | 2 +- compiler/ncgmem.pas | 2 +- compiler/ngtcon.pas | 8 ++++---- compiler/x86_64/nx64flw.pas | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/compiler/cgobj.pas b/compiler/cgobj.pas index a2da492b30..bda0b02b04 100644 --- a/compiler/cgobj.pas +++ b/compiler/cgobj.pas @@ -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); diff --git a/compiler/ncgflw.pas b/compiler/ncgflw.pas index 51e1ea1260..51d0f7cdd6 100644 --- a/compiler/ncgflw.pas +++ b/compiler/ncgflw.pas @@ -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); diff --git a/compiler/ncginl.pas b/compiler/ncginl.pas index aea6cd6b6b..3aff050b93 100644 --- a/compiler/ncginl.pas +++ b/compiler/ncginl.pas @@ -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 diff --git a/compiler/ncgmem.pas b/compiler/ncgmem.pas index d44d0a9bc0..dd9886049f 100644 --- a/compiler/ncgmem.pas +++ b/compiler/ncgmem.pas @@ -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 diff --git a/compiler/ngtcon.pas b/compiler/ngtcon.pas index b116b8ca78..afe86662fb 100644 --- a/compiler/ngtcon.pas +++ b/compiler/ngtcon.pas @@ -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; diff --git a/compiler/x86_64/nx64flw.pas b/compiler/x86_64/nx64flw.pas index 97973ac3b5..a065cd31f4 100644 --- a/compiler/x86_64/nx64flw.pas +++ b/compiler/x86_64/nx64flw.pas @@ -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);