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