* TVMTWriter.writeinterfaceids: pass target asmlist as parameter.

* Changed section type for interface GUID and name from sec_rodata to sec_rodata_norel, because GUIDs and strings are not relocatable.

git-svn-id: trunk@25259 -
This commit is contained in:
sergei 2013-08-14 11:54:00 +00:00
parent c92eaebf34
commit 3a12e94d21

View File

@ -95,7 +95,7 @@ implementation
constructor create(c:tobjectdef);
{ write the VMT to al_globals }
procedure writevmt;
procedure writeinterfaceids;
procedure writeinterfaceids(list: TAsmList);
end;
@ -658,7 +658,7 @@ implementation
{ Write interface identifiers to the data section }
procedure TVMTWriter.writeinterfaceids;
procedure TVMTWriter.writeinterfaceids(list: TAsmList);
var
i : longint;
s : string;
@ -666,21 +666,21 @@ implementation
if assigned(_class.iidguid) then
begin
s:=make_mangledname('IID',_class.owner,_class.objname^);
maybe_new_object_file(current_asmdata.asmlists[al_globals]);
new_section(current_asmdata.asmlists[al_globals],sec_rodata,s,const_align(sizeof(pint)));
current_asmdata.asmlists[al_globals].concat(Tai_symbol.Createname_global(s,AT_DATA,0));
current_asmdata.asmlists[al_globals].concat(Tai_const.Create_32bit(longint(_class.iidguid^.D1)));
current_asmdata.asmlists[al_globals].concat(Tai_const.Create_16bit(_class.iidguid^.D2));
current_asmdata.asmlists[al_globals].concat(Tai_const.Create_16bit(_class.iidguid^.D3));
maybe_new_object_file(list);
new_section(list,sec_rodata_norel,s,const_align(sizeof(pint)));
list.concat(Tai_symbol.Createname_global(s,AT_DATA,0));
list.concat(Tai_const.Create_32bit(longint(_class.iidguid^.D1)));
list.concat(Tai_const.Create_16bit(_class.iidguid^.D2));
list.concat(Tai_const.Create_16bit(_class.iidguid^.D3));
for i:=Low(_class.iidguid^.D4) to High(_class.iidguid^.D4) do
current_asmdata.asmlists[al_globals].concat(Tai_const.Create_8bit(_class.iidguid^.D4[i]));
list.concat(Tai_const.Create_8bit(_class.iidguid^.D4[i]));
end;
maybe_new_object_file(current_asmdata.asmlists[al_globals]);
maybe_new_object_file(list);
s:=make_mangledname('IIDSTR',_class.owner,_class.objname^);
new_section(current_asmdata.asmlists[al_globals],sec_rodata,s,sizeof(pint));
current_asmdata.asmlists[al_globals].concat(Tai_symbol.Createname_global(s,AT_DATA,0));
current_asmdata.asmlists[al_globals].concat(Tai_const.Create_8bit(length(_class.iidstr^)));
current_asmdata.asmlists[al_globals].concat(Tai_string.Create(_class.iidstr^));
new_section(list,sec_rodata_norel,s,sizeof(pint));
list.concat(Tai_symbol.Createname_global(s,AT_DATA,0));
list.concat(Tai_const.Create_8bit(length(_class.iidstr^)));
list.concat(Tai_string.Create(_class.iidstr^));
end;
@ -958,7 +958,7 @@ implementation
begin
vmtwriter:=TVMTWriter.create(tobjectdef(def));
if is_interface(tobjectdef(def)) then
vmtwriter.writeinterfaceids;
vmtwriter.writeinterfaceids(current_asmdata.AsmLists[al_globals]);
if (oo_has_vmt in tobjectdef(def).objectoptions) then
vmtwriter.writevmt;
vmtwriter.free;