mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-22 04:29:29 +02:00
* 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:
parent
c92eaebf34
commit
3a12e94d21
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user