tnodeuitls: merge GenerateObjCImageInfo into InsertObjectInfo

LLVM needs to insert the Objective-C image info into the general object info
metadata. This way we don't need to store a reference to that metadata so
as to add extra data to it later (tnodeutils is never instantiated, it only
contains class methods)
This commit is contained in:
Jonas Maebe 2022-04-16 21:13:21 +02:00
parent 78535bbcd8
commit 229eb93e72
3 changed files with 99 additions and 109 deletions

View File

@ -40,7 +40,6 @@ interface
public
class procedure InsertObjectInfo; override;
class procedure RegisterUsedAsmSym(sym: TAsmSymbol; def: tdef; compileronly: boolean); override;
class procedure GenerateObjCImageInfo; override;
class procedure RegisterModuleInitFunction(pd: tprocdef); override;
class procedure RegisterModuleFiniFunction(pd: tprocdef); override;
end;
@ -205,11 +204,89 @@ implementation
class procedure tllvmnodeutils.InsertObjectInfo;
var
llvmmoduleflags,
objcmoduleflag,
dwarfversionflag: tai_llvmbasemetadatanode;
objcabiversion: longint;
begin
inherited;
llvmmoduleflags:=tai_llvmnamedmetadatanode.create('llvm.module.flags');
current_asmdata.AsmLists[al_rotypedconsts].Concat(llvmmoduleflags);
if (m_objectivec1 in current_settings.modeswitches) then
begin
{ Objective-C ABI version }
if not(target_info.system in [system_powerpc_darwin,system_powerpc64_darwin,system_i386_darwin,system_x86_64_darwin]) or
(CompareVersionStrings(MacOSXVersionMin,'10.5')>=0) then
objcabiversion:=2
else
objcabiversion:=1;
objcmoduleflag:=tai_llvmunnamedmetadatanode.create;
objcmoduleflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(1)));
objcmoduleflag.addvalue(tai_simpletypedconst.create(charpointertype,tai_string.Create('Objective-C Version')));
objcmoduleflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(objcabiversion)));
llvmmoduleflags.addvalue(llvm_getmetadatareftypedconst(objcmoduleflag));
current_asmdata.AsmLists[al_rotypedconsts].Concat(objcmoduleflag);
{ image info version }
objcmoduleflag:=tai_llvmunnamedmetadatanode.create;
objcmoduleflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(1)));
objcmoduleflag.addvalue(tai_simpletypedconst.create(charpointertype,tai_string.Create('Objective-C Image Info Version')));
objcmoduleflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(0)));
llvmmoduleflags.addvalue(llvm_getmetadatareftypedconst(objcmoduleflag));
current_asmdata.AsmLists[al_rotypedconsts].Concat(objcmoduleflag);
{ image info section }
objcmoduleflag:=tai_llvmunnamedmetadatanode.create;
objcmoduleflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(1)));
objcmoduleflag.addvalue(tai_simpletypedconst.create(charpointertype,tai_string.Create('Objective-C Image Info Section')));
objcmoduleflag.addvalue(tai_simpletypedconst.create(charpointertype,tai_string.Create(objc_section_name(sec_objc_image_info))));
llvmmoduleflags.addvalue(llvm_getmetadatareftypedconst(objcmoduleflag));
current_asmdata.AsmLists[al_rotypedconsts].Concat(objcmoduleflag);
{ garbage collection }
objcmoduleflag:=tai_llvmunnamedmetadatanode.create;
objcmoduleflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(1)));
objcmoduleflag.addvalue(tai_simpletypedconst.create(charpointertype,tai_string.Create('Objective-C Garbage Collection')));
objcmoduleflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(0)));
llvmmoduleflags.addvalue(llvm_getmetadatareftypedconst(objcmoduleflag));
current_asmdata.AsmLists[al_rotypedconsts].Concat(objcmoduleflag);
{ insert newly created defs in the implementation rather than interface symtable
(the interface symtable is sealed at this point) }
end;
{ debug information }
if (([cs_debuginfo,cs_lineinfo]*current_settings.moduleswitches)<>[]) and
(target_dbg.id in [dbg_dwarf2,dbg_dwarf3,dbg_dwarf4]) then
begin
{ the debug info version is the version of the debug info metadata
format }
dwarfversionflag:=tai_llvmunnamedmetadatanode.create;
dwarfversionflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(2)));
dwarfversionflag.addvalue(tai_simpletypedconst.create(charpointertype,tai_string.Create('Debug Info Version')));
dwarfversionflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(llvm_debuginfo_metadata_format[current_settings.llvmversion])));
llvmmoduleflags.addvalue(llvm_getmetadatareftypedconst(dwarfversionflag));
current_asmdata.AsmLists[al_rotypedconsts].Concat(dwarfversionflag);
{ dwarf version }
dwarfversionflag:=tai_llvmunnamedmetadatanode.create;
dwarfversionflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(2)));
dwarfversionflag.addvalue(tai_simpletypedconst.create(charpointertype,tai_string.Create('Dwarf Version')));
case target_dbg.id of
dbg_dwarf2:
dwarfversionflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(2)));
dbg_dwarf3:
dwarfversionflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(3)));
dbg_dwarf4:
dwarfversionflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(4)));
else
internalerror(2022022012);
end;
llvmmoduleflags.addvalue(llvm_getmetadatareftypedconst(dwarfversionflag));
current_asmdata.AsmLists[al_rotypedconsts].Concat(dwarfversionflag);
end;
{ insert newly created defs in the implementation rather than interface symtable
(the interface symtable is sealed at this point) }
symtablestack.push(current_module.localsymtable);
{ add the llvm.compiler.used array }
@ -254,86 +331,6 @@ implementation
end;
class procedure tllvmnodeutils.GenerateObjCImageInfo;
var
llvmmoduleflags,
objcmoduleflag,
dwarfversionflag: tai_llvmbasemetadatanode;
objcabiversion: longint;
begin
llvmmoduleflags:=tai_llvmnamedmetadatanode.create('llvm.module.flags');
current_asmdata.AsmLists[al_rotypedconsts].Concat(llvmmoduleflags);
{ Objective-C ABI version }
if not(target_info.system in [system_powerpc_darwin,system_powerpc64_darwin,system_i386_darwin,system_x86_64_darwin]) or
(CompareVersionStrings(MacOSXVersionMin,'10.5')>=0) then
objcabiversion:=2
else
objcabiversion:=1;
objcmoduleflag:=tai_llvmunnamedmetadatanode.create;
objcmoduleflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(1)));
objcmoduleflag.addvalue(tai_simpletypedconst.create(charpointertype,tai_string.Create('Objective-C Version')));
objcmoduleflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(objcabiversion)));
llvmmoduleflags.addvalue(llvm_getmetadatareftypedconst(objcmoduleflag));
current_asmdata.AsmLists[al_rotypedconsts].Concat(objcmoduleflag);
{ image info version }
objcmoduleflag:=tai_llvmunnamedmetadatanode.create;
objcmoduleflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(1)));
objcmoduleflag.addvalue(tai_simpletypedconst.create(charpointertype,tai_string.Create('Objective-C Image Info Version')));
objcmoduleflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(0)));
llvmmoduleflags.addvalue(llvm_getmetadatareftypedconst(objcmoduleflag));
current_asmdata.AsmLists[al_rotypedconsts].Concat(objcmoduleflag);
{ image info section }
objcmoduleflag:=tai_llvmunnamedmetadatanode.create;
objcmoduleflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(1)));
objcmoduleflag.addvalue(tai_simpletypedconst.create(charpointertype,tai_string.Create('Objective-C Image Info Section')));
objcmoduleflag.addvalue(tai_simpletypedconst.create(charpointertype,tai_string.Create(objc_section_name(sec_objc_image_info))));
llvmmoduleflags.addvalue(llvm_getmetadatareftypedconst(objcmoduleflag));
current_asmdata.AsmLists[al_rotypedconsts].Concat(objcmoduleflag);
{ garbage collection }
objcmoduleflag:=tai_llvmunnamedmetadatanode.create;
objcmoduleflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(1)));
objcmoduleflag.addvalue(tai_simpletypedconst.create(charpointertype,tai_string.Create('Objective-C Garbage Collection')));
objcmoduleflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(0)));
llvmmoduleflags.addvalue(llvm_getmetadatareftypedconst(objcmoduleflag));
current_asmdata.AsmLists[al_rotypedconsts].Concat(objcmoduleflag);
{ debug information }
if (([cs_debuginfo,cs_lineinfo]*current_settings.moduleswitches)<>[]) and
(target_dbg.id in [dbg_dwarf2,dbg_dwarf3,dbg_dwarf4]) then
begin
{ the debug info version is the version of the debug info metadata
format }
dwarfversionflag:=tai_llvmunnamedmetadatanode.create;
dwarfversionflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(2)));
dwarfversionflag.addvalue(tai_simpletypedconst.create(charpointertype,tai_string.Create('Debug Info Version')));
dwarfversionflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(llvm_debuginfo_metadata_format[current_settings.llvmversion])));
llvmmoduleflags.addvalue(llvm_getmetadatareftypedconst(dwarfversionflag));
current_asmdata.AsmLists[al_rotypedconsts].Concat(dwarfversionflag);
{ dwarf version }
dwarfversionflag:=tai_llvmunnamedmetadatanode.create;
dwarfversionflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(2)));
dwarfversionflag.addvalue(tai_simpletypedconst.create(charpointertype,tai_string.Create('Dwarf Version')));
case target_dbg.id of
dbg_dwarf2:
dwarfversionflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(2)));
dbg_dwarf3:
dwarfversionflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(3)));
dbg_dwarf4:
dwarfversionflag.addvalue(tai_simpletypedconst.create(s32inttype,tai_const.Create_32bit(4)));
else
internalerror(2022022012);
end;
llvmmoduleflags.addvalue(llvm_getmetadatareftypedconst(dwarfversionflag));
current_asmdata.AsmLists[al_rotypedconsts].Concat(dwarfversionflag);
end;
end;
class procedure tllvmnodeutils.RegisterModuleInitFunction(pd: tprocdef);
begin
current_module.llvminitprocs.add(pd);

View File

@ -146,8 +146,6 @@ interface
class procedure RegisterModuleInitFunction(pd: tprocdef); virtual;
class procedure RegisterModuleFiniFunction(pd: tprocdef); virtual;
class procedure GenerateObjCImageInfo; virtual;
strict protected
class procedure add_main_procdef_paras(pd: tdef); virtual;
end;
@ -1612,8 +1610,25 @@ implementation
class procedure tnodeutils.InsertObjectInfo;
var
tcb: ttai_typedconstbuilder;
begin
{ don't do anything by default }
if (m_objectivec1 in current_settings.modeswitches) then
begin
{ first 4 bytes contain version information about this section (currently version 0),
next 4 bytes contain flags (currently only regarding whether the code in the object
file supports or requires garbage collection)
}
tcb:=ctai_typedconstbuilder.create([tcalo_new_section,tcalo_no_dead_strip]);
tcb.emit_ord_const(0,u64inttype);
current_asmdata.asmlists[al_objc_data].concatList(
tcb.get_final_asmlist(
current_asmdata.DefineAsmSymbol(target_asm.labelprefix+'_OBJC_IMAGE_INFO',AB_LOCAL,AT_DATA,u64inttype),
u64inttype,sec_objc_image_info,'_OBJC_IMAGE_INFO',const_align(sizeof(pint))
)
);
tcb.free;
end;
end;
@ -1637,26 +1652,6 @@ implementation
end;
class procedure tnodeutils.GenerateObjCImageInfo;
var
tcb: ttai_typedconstbuilder;
begin
{ first 4 bytes contain version information about this section (currently version 0),
next 4 bytes contain flags (currently only regarding whether the code in the object
file supports or requires garbage collection)
}
tcb:=ctai_typedconstbuilder.create([tcalo_new_section,tcalo_no_dead_strip]);
tcb.emit_ord_const(0,u64inttype);
current_asmdata.asmlists[al_objc_data].concatList(
tcb.get_final_asmlist(
current_asmdata.DefineAsmSymbol(target_asm.labelprefix+'_OBJC_IMAGE_INFO',AB_LOCAL,AT_DATA,u64inttype),
u64inttype,sec_objc_image_info,'_OBJC_IMAGE_INFO',const_align(sizeof(pint))
)
);
tcb.free;
end;
class procedure tnodeutils.add_main_procdef_paras(pd: tdef);
var
pvs: tparavarsym;

View File

@ -1898,8 +1898,6 @@ procedure MaybeGenerateObjectiveCImageInfo(globalst, localst: tsymtable);
begin
if (m_objectivec1 in current_settings.modeswitches) then
begin
cnodeutils.GenerateObjCImageInfo;
{ generate rtti for all obj-c classes, protocols and categories
defined in this module. }
if not(target_info.system in systems_objc_nfabi) then