* fixed Objective-C metadata generation for LLVM

git-svn-id: branches/debug_eh@41980 -
This commit is contained in:
Jonas Maebe 2019-05-02 19:45:34 +00:00
parent 024b38e1ff
commit 7dbbce157f
3 changed files with 76 additions and 17 deletions

View File

@ -27,7 +27,7 @@ interface
uses
globtype,cclasses,
aasmbase,aasmdata,ngenutil,
aasmbase,aasmdata,aasmllvmmetadata, ngenutil,
symtype,symconst,symsym,symdef;
@ -39,6 +39,7 @@ interface
public
class procedure InsertObjectInfo; override;
class procedure RegisterUsedAsmSym(sym: TAsmSymbol; def: tdef; compileronly: boolean); override;
class procedure GenerateObjCImageInfo; override;
end;
@ -49,13 +50,13 @@ implementation
aasmtai,cpubase,llvmbase,aasmllvm,
aasmcnst,nllvmtcon,
symbase,symtable,defutil,
llvmtype;
llvmtype,
objcasm;
class procedure tllvmnodeutils.insertbsssym(list: tasmlist; sym: tstaticvarsym; size: asizeint; varalign: shortint);
var
asmsym: tasmsymbol;
field1, field2: tsym;
tcb: ttai_typedconstbuilder;
begin
if sym.globalasmsym then
asmsym:=current_asmdata.DefineAsmSymbol(sym.mangledname,AB_GLOBAL,AT_DATA,sym.vardef)
@ -195,6 +196,54 @@ implementation
end;
class procedure tllvmnodeutils.GenerateObjCImageInfo;
var
llvmmoduleflags,
objcmoduleflag: 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);
end;
begin
cnodeutils:=tllvmnodeutils;
end.

View File

@ -143,6 +143,8 @@ interface
also for the linker }
class procedure RegisterUsedAsmSym(sym: TAsmSymbol; def: tdef; compileronly: boolean); virtual;
class procedure GenerateObjCImageInfo; virtual;
strict protected
class procedure add_main_procdef_paras(pd: tdef); virtual;
end;
@ -1558,6 +1560,26 @@ 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',sizeof(pint)
)
);
tcb.free;
end;
class procedure tnodeutils.add_main_procdef_paras(pd: tdef);
var
pvs: tparavarsym;

View File

@ -48,6 +48,7 @@ implementation
objcdef,objcutil,
aasmcnst,
symconst,symtype,symsym,symtable,
ngenutil,
verbose;
type
@ -1909,23 +1910,10 @@ constructor tobjcrttiwriter_nonfragile.create;
procedure MaybeGenerateObjectiveCImageInfo(globalst, localst: tsymtable);
var
objcrttiwriter: tobjcrttiwriter;
tcb: ttai_typedconstbuilder;
begin
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',sizeof(pint)
)
);
tcb.free;
cnodeutils.GenerateObjCImageInfo;
{ generate rtti for all obj-c classes, protocols and categories
defined in this module. }