mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-02 08:29:32 +01:00
- removed maxcrecordalign parameter/field from recordsymtables, as this value
cannot be modified in the settings (so we can directly use the one from
current_settings)
git-svn-id: trunk@42447 -
This commit is contained in:
parent
c932dfaf70
commit
d8903ce6b3
@ -393,7 +393,7 @@ type
|
||||
maxcrecordalign: specify maximum C record alignment (no equivalent in
|
||||
source code)
|
||||
}
|
||||
function begin_anonymous_record(const optionalname: string; packrecords, recordalign, recordalignmin, maxcrecordalign: shortint): trecorddef; virtual;
|
||||
function begin_anonymous_record(const optionalname: string; packrecords, recordalign, recordalignmin: shortint): trecorddef; virtual;
|
||||
function end_anonymous_record: trecorddef; virtual;
|
||||
|
||||
{ add a placeholder element at the current position that later can be
|
||||
@ -1399,7 +1399,7 @@ implementation
|
||||
result.ofs:=0;
|
||||
{ pack the data, so that we don't add unnecessary null bytes after the
|
||||
constant string }
|
||||
begin_anonymous_record('$'+get_dynstring_rec_name(stringtype,false,len),1,sizeof(TConstPtrUInt),1,1);
|
||||
begin_anonymous_record('$'+get_dynstring_rec_name(stringtype,false,len),1,sizeof(TConstPtrUInt),1);
|
||||
string_symofs:=get_string_symofs(stringtype,false);
|
||||
{ encoding }
|
||||
emit_tai(tai_const.create_16bit(encoding),u16inttype);
|
||||
@ -1611,7 +1611,7 @@ implementation
|
||||
if (typ<>st_widestring) or
|
||||
not winlike then
|
||||
begin
|
||||
result:=crecorddef.create_global_internal('$'+name,1,1,1);
|
||||
result:=crecorddef.create_global_internal('$'+name,1,1);
|
||||
{ encoding }
|
||||
result.add_field_by_def('',u16inttype);
|
||||
{ element size }
|
||||
@ -1637,8 +1637,7 @@ implementation
|
||||
else
|
||||
begin
|
||||
result:=crecorddef.create_global_internal('$'+name,4,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
{ length in bytes }
|
||||
result.add_field_by_def('',s32inttype);
|
||||
streledef:=cwidechartype;
|
||||
@ -1689,8 +1688,7 @@ implementation
|
||||
result.lab:=startlab;
|
||||
datatcb.begin_anonymous_record('$'+get_dynstring_rec_name(st_widestring,true,strlength),
|
||||
4,4,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
datatcb.emit_tai(Tai_const.Create_32bit(strlength*cwidechartype.size),s32inttype);
|
||||
{ can we optimise by placing the string constant label at the
|
||||
required offset? }
|
||||
@ -1749,7 +1747,7 @@ implementation
|
||||
result.ofs:=0;
|
||||
{ pack the data, so that we don't add unnecessary null bytes after the
|
||||
constant string }
|
||||
begin_anonymous_record('',1,sizeof(TConstPtrUInt),1,1);
|
||||
begin_anonymous_record('',1,sizeof(TConstPtrUInt),1);
|
||||
dynarray_symofs:=get_dynarray_symofs;
|
||||
{ what to do if ptrsinttype <> sizesinttype??? }
|
||||
emit_tai(tai_const.create_sizeint(-1),ptrsinttype);
|
||||
@ -1928,7 +1926,7 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
function ttai_typedconstbuilder.begin_anonymous_record(const optionalname: string; packrecords, recordalign, recordalignmin, maxcrecordalign: shortint): trecorddef;
|
||||
function ttai_typedconstbuilder.begin_anonymous_record(const optionalname: string; packrecords, recordalign, recordalignmin: shortint): trecorddef;
|
||||
var
|
||||
anonrecorddef: trecorddef;
|
||||
typesym: ttypesym;
|
||||
@ -1949,7 +1947,7 @@ implementation
|
||||
end;
|
||||
end;
|
||||
{ create skeleton def }
|
||||
anonrecorddef:=crecorddef.create_global_internal(optionalname,packrecords,recordalignmin,maxcrecordalign);
|
||||
anonrecorddef:=crecorddef.create_global_internal(optionalname,packrecords,recordalignmin);
|
||||
trecordsymtable(anonrecorddef.symtable).recordalignment:=recordalign;
|
||||
{ generic aggregate housekeeping }
|
||||
begin_aggregate_internal(anonrecorddef,true);
|
||||
|
||||
@ -197,8 +197,7 @@ uses
|
||||
tcb:=ctai_typedconstbuilder.create([tcalo_new_section,tcalo_vectorized_dead_strip_end,tcalo_data_force_indirect,tcalo_is_public_asm]);
|
||||
tcb.begin_anonymous_record(internaltypeprefixName[itp_emptyrec],
|
||||
default_settings.packrecords,sizeof(pint),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
current_asmdata.AsmLists[al_resourcestrings].concatList(
|
||||
tcb.get_final_asmlist_vectorized_dead_strip(
|
||||
tcb.end_anonymous_record,'RESSTR','',current_module.localsymtable,sizeof(pint)
|
||||
|
||||
@ -68,7 +68,7 @@ interface
|
||||
record consisting of 4 longints must be returned as a record consisting of
|
||||
two int64's on x86-64. This function is used to create (and reuse)
|
||||
temporary recorddefs for such purposes.}
|
||||
function llvmgettemprecorddef(const fieldtypes: array of tdef; packrecords, recordalignmin, maxcrecordalign: shortint): trecorddef;
|
||||
function llvmgettemprecorddef(const fieldtypes: array of tdef; packrecords, recordalignmin: shortint): trecorddef;
|
||||
|
||||
{ get the llvm type corresponding to a parameter, e.g. a record containing
|
||||
two integer int64 for an arbitrary record split over two individual int64
|
||||
@ -862,7 +862,7 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
function llvmgettemprecorddef(const fieldtypes: array of tdef; packrecords, recordalignmin, maxcrecordalign: shortint): trecorddef;
|
||||
function llvmgettemprecorddef(const fieldtypes: array of tdef; packrecords, recordalignmin: shortint): trecorddef;
|
||||
var
|
||||
i: longint;
|
||||
res: PHashSetItem;
|
||||
@ -920,7 +920,7 @@ implementation
|
||||
if not assigned(res^.Data) then
|
||||
begin
|
||||
res^.Data:=crecorddef.create_global_internal(typename,packrecords,
|
||||
recordalignmin,maxcrecordalign);
|
||||
recordalignmin);
|
||||
for i:=low(fieldtypes) to high(fieldtypes) do
|
||||
trecorddef(res^.Data).add_field_by_def('F'+tostr(i),fieldtypes[i]);
|
||||
end;
|
||||
@ -1023,8 +1023,7 @@ implementation
|
||||
retloc:=retloc^.next;
|
||||
until not assigned(retloc);
|
||||
result:=llvmgettemprecorddef(slice(retdeflist,i),C_alignment,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
include(result.defoptions,df_llvm_no_struct_packing);
|
||||
end;
|
||||
|
||||
|
||||
@ -148,8 +148,7 @@ implementation
|
||||
exactly two fields in this struct) }
|
||||
landingpaddef:=llvmgettemprecorddef([voidpointertype,u32inttype],
|
||||
1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
reg:=hlcg.getregisterfordef(list,landingpaddef);
|
||||
landingpad:=taillvm.landingpad(reg,landingpaddef,{clause}nil);
|
||||
list.concat(landingpad);
|
||||
|
||||
@ -385,13 +385,12 @@ implementation
|
||||
arraydef:
|
||||
{ in an array, all elements come right after each other ->
|
||||
replace with a packed record }
|
||||
newdef:=crecorddef.create_global_internal('',1,1,1);
|
||||
newdef:=crecorddef.create_global_internal('',1,1);
|
||||
recorddef,
|
||||
objectdef:
|
||||
newdef:=crecorddef.create_global_internal('',
|
||||
tabstractrecordsymtable(tabstractrecorddef(info.def).symtable).recordalignment,
|
||||
tabstractrecordsymtable(tabstractrecorddef(info.def).symtable).recordalignmin,
|
||||
tabstractrecordsymtable(tabstractrecorddef(info.def).symtable).maxCrecordalign);
|
||||
tabstractrecordsymtable(tabstractrecorddef(info.def).symtable).recordalignmin);
|
||||
else
|
||||
internalerror(2015122401);
|
||||
end;
|
||||
|
||||
@ -177,8 +177,7 @@ implementation
|
||||
fields[1]:=pd.getcopyas(procvardef,pc_address_only,'');
|
||||
fields[2]:=voidpointertype;
|
||||
itemdef:=llvmgettemprecorddef(fields,C_alignment,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
include(itemdef.defoptions,df_llvm_no_struct_packing);
|
||||
tcb:=ctai_typedconstbuilder.create([tcalo_new_section]);
|
||||
tllvmtai_typedconstbuilder(tcb).appendingdef:=true;
|
||||
|
||||
@ -486,13 +486,13 @@ implementation
|
||||
end;
|
||||
|
||||
{ create a temp to store parameter values }
|
||||
vardispatchparadef:=crecorddef.create_global_internal('',voidpointertype.size,voidpointertype.size,current_settings.alignment.maxCrecordalign);
|
||||
vardispatchparadef:=crecorddef.create_global_internal('',voidpointertype.size,voidpointertype.size);
|
||||
{ the size will be set once the vardistpatchparadef record has been completed }
|
||||
params:=ctempcreatenode.create(vardispatchparadef,0,tt_persistent,false);
|
||||
addstatement(statements,params);
|
||||
|
||||
tcb:=ctai_typedconstbuilder.create([tcalo_make_dead_strippable,tcalo_new_section]);
|
||||
tcb.begin_anonymous_record('',1,sizeof(pint),1,1);
|
||||
tcb.begin_anonymous_record('',1,sizeof(pint),1);
|
||||
|
||||
if not variantdispatch then { generate a tdispdesc record }
|
||||
begin
|
||||
|
||||
@ -205,8 +205,7 @@ implementation
|
||||
para : tparavarsym;
|
||||
begin
|
||||
tcb.begin_anonymous_record('',defaultpacking,min(reqalign,SizeOf(PInt)),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
totalcount:=0;
|
||||
rtticount:=0;
|
||||
@ -241,8 +240,7 @@ implementation
|
||||
def.init_paraloc_info(callerside);
|
||||
|
||||
tcb.begin_anonymous_record('',defaultpacking,min(reqalign,SizeOf(PInt)),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
write_rtti_reference(tcb,def.returndef,fullrtti);
|
||||
write_callconv(tcb,def);
|
||||
@ -256,8 +254,7 @@ implementation
|
||||
para:=tparavarsym(def.paras[k]);
|
||||
|
||||
tcb.begin_anonymous_record('',defaultpacking,min(reqalign,SizeOf(PInt)),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
if is_open_array(para.vardef) or is_array_of_const(para.vardef) then
|
||||
write_rtti_reference(tcb,tarraydef(para.vardef).elementdef,fullrtti)
|
||||
@ -297,8 +294,7 @@ implementation
|
||||
{ TTypeInfo, always packed and doesn't need alignment }
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rtti_header]+tostr(length(name)),1,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
if def.typ=arraydef then
|
||||
InternalError(201012211);
|
||||
tcb.emit_tai(Tai_const.Create_8bit(typekind),u8inttype);
|
||||
@ -400,14 +396,12 @@ implementation
|
||||
loctcb:=ctai_typedconstbuilder.create([tcalo_is_lab,tcalo_make_dead_strippable,tcalo_apply_constalign]);
|
||||
|
||||
loctcb.begin_anonymous_record('',defaultpacking,min(reqalign,SizeOf(PInt)),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
loctcb.emit_ord_const(length(locs),u8inttype);
|
||||
for i:=low(locs) to high(locs) do
|
||||
begin
|
||||
loctcb.begin_anonymous_record('',defaultpacking,min(reqalign,SizeOf(PInt)),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
loctcb.emit_ord_const(locs[i].loctype,u8inttype);
|
||||
loctcb.emit_ord_const(locs[i].regsub,u8inttype);
|
||||
loctcb.emit_ord_const(locs[i].regindex,u16inttype);
|
||||
@ -519,8 +513,7 @@ implementation
|
||||
tcb.start_internal_data_builder(current_asmdata.AsmLists[al_rtti],sec_rodata,'',datatcb,tbllbl);
|
||||
|
||||
datatcb.begin_anonymous_record('',defaultpacking,min(reqalign,SizeOf(PInt)),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
datatcb.emit_ord_const(list.count,u32inttype);
|
||||
|
||||
entrydef:=get_recorddef(itp_init_mop_offset_entry,[voidcodepointertype,sizeuinttype],defaultpacking);
|
||||
@ -865,8 +858,7 @@ implementation
|
||||
|
||||
begin
|
||||
tcb.begin_anonymous_record('',defaultpacking,min(reqalign,SizeOf(PInt)),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
tcb.emit_ord_const(published_properties_count(st),u16inttype);
|
||||
for i:=0 to st.SymList.Count-1 do
|
||||
begin
|
||||
@ -886,8 +878,7 @@ implementation
|
||||
tcb.begin_anonymous_record(
|
||||
propdefname,
|
||||
1,min(reqalign,SizeOf(PInt)),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
if ppo_indexed in tpropertysym(sym).propoptions then
|
||||
proctypesinfo:=$40
|
||||
else
|
||||
@ -950,8 +941,7 @@ implementation
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rtti_ansistr],
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
tcb.emit_ord_const(def.encoding,u16inttype);
|
||||
tcb.end_anonymous_record;
|
||||
@ -997,13 +987,11 @@ implementation
|
||||
and o2s arrays for llvm (otherwise we have to write out the entire
|
||||
type definition every time we access an element from this record) }
|
||||
tcb.begin_anonymous_record(internaltypeprefixName[itp_rtti_enum_size_start_rec]+def.unique_id_str,defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
tcb.next_field_name:='typ_union_rec';
|
||||
tcb.begin_anonymous_record(internaltypeprefixName[itp_rtti_enum_size_start_rec2]+def.unique_id_str,defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
case longint(def.size) of
|
||||
1 :
|
||||
tcb.emit_ord_const(otUByte,u8inttype);
|
||||
@ -1021,16 +1009,14 @@ implementation
|
||||
We need to adhere to this, otherwise things will break. }
|
||||
tcb.next_field_name:='min_max_rec';
|
||||
tcb.begin_anonymous_record(internaltypeprefixName[itp_rtti_enum_min_max_rec]+def.unique_id_str,defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
tcb.emit_ord_const(def.min,s32inttype);
|
||||
tcb.emit_ord_const(def.max,s32inttype);
|
||||
tcb.next_field_name:='basetype_array_rec';
|
||||
{ all strings must appear right after each other -> from now on
|
||||
packrecords 1 (but the start must still be aligned) }
|
||||
tcb.begin_anonymous_record(internaltypeprefixName[itp_rtti_enum_basetype_array_rec]+def.unique_id_str,1,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
{ write base type }
|
||||
write_rtti_reference(tcb,def.basedef,rt);
|
||||
for i:=0 to def.symtable.SymList.Count-1 do
|
||||
@ -1101,15 +1087,13 @@ implementation
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rtti_ord_outer]+elesize,
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
tcb.emit_ord_const(byte(trans[def.ordtype]),u8inttype);
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rtti_ord_inner]+elesize,
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
{Convert to longint to smuggle values in high(longint)+1..high(cardinal) into asmlist.}
|
||||
case deftrans of
|
||||
otUQWord:
|
||||
@ -1166,8 +1150,7 @@ implementation
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_1byte],
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
tcb.emit_ord_const(ftCurr,u8inttype);
|
||||
tcb.end_anonymous_record;
|
||||
@ -1188,8 +1171,7 @@ implementation
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_1byte],
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
tcb.emit_ord_const(translate[def.floattype],u8inttype);
|
||||
tcb.end_anonymous_record;
|
||||
@ -1202,14 +1184,12 @@ implementation
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rtti_set_outer],
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rtti_set_middle],
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
case def.size of
|
||||
1:
|
||||
tcb.emit_ord_const(otUByte,u8inttype);
|
||||
@ -1223,8 +1203,7 @@ implementation
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rtti_set_inner],
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
tcb.emit_ord_const(def.size,sizesinttype);
|
||||
write_rtti_reference(tcb,def.elementdef,rt);
|
||||
tcb.end_anonymous_record;
|
||||
@ -1264,8 +1243,7 @@ implementation
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rtti_normal_array]+tostr(dimcount),
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
{ total size = elecount * elesize of the first arraydef }
|
||||
tcb.emit_tai(Tai_const.Create_sizeint(def.elecount*def.elesize),sizeuinttype);
|
||||
@ -1296,8 +1274,7 @@ implementation
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rtti_dyn_array],
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
{ size of elements }
|
||||
tcb.emit_tai(Tai_const.Create_sizeint(def.elesize),sizeuinttype);
|
||||
@ -1322,8 +1299,7 @@ implementation
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rtti_ref],
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
write_rtti_reference(tcb,def.pointeddef,rt);
|
||||
tcb.end_anonymous_record;
|
||||
@ -1335,8 +1311,7 @@ implementation
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rtti_ref],
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
write_rtti_reference(tcb,def.pointeddef,rt);
|
||||
tcb.end_anonymous_record;
|
||||
@ -1360,8 +1335,7 @@ implementation
|
||||
tcb.begin_anonymous_record(
|
||||
rttilab.Name,
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin
|
||||
);
|
||||
|
||||
{ use "succ" to omit first enum item "mop_none" }
|
||||
@ -1394,8 +1368,7 @@ implementation
|
||||
only be aligned to 4 even on 64 bit target (while the rtti code
|
||||
in typinfo expects alignments to sizeof(pointer)) }
|
||||
tcb.begin_anonymous_record('',defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
|
||||
@ -1451,8 +1424,7 @@ implementation
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rtti_proc_param]+tostr(length(parasym.realname)),
|
||||
defaultpacking,min(reqalign,SizeOf(PInt)),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
{ write flags for current parameter }
|
||||
write_param_flag(tcb,parasym);
|
||||
{ write param type }
|
||||
@ -1476,8 +1448,7 @@ implementation
|
||||
{ write method id and name }
|
||||
write_header(tcb,def,tkMethod);
|
||||
tcb.begin_anonymous_record('',defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
|
||||
@ -1520,8 +1491,7 @@ implementation
|
||||
begin
|
||||
write_header(tcb,def,tkProcvar);
|
||||
tcb.begin_anonymous_record('',defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
|
||||
@ -1632,8 +1602,7 @@ implementation
|
||||
collect_propnamelist(propnamelist,def);
|
||||
|
||||
tcb.begin_anonymous_record('',defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
{ write parent typeinfo }
|
||||
write_rtti_reference(tcb,def.childof,fullrtti);
|
||||
@ -1659,8 +1628,7 @@ implementation
|
||||
tcb.emit_shortstring_const(current_module.realmodulename^);
|
||||
|
||||
tcb.begin_anonymous_record('',defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
{ write iidstr }
|
||||
if def.objecttype=odt_interfacecorba then
|
||||
@ -1704,8 +1672,7 @@ implementation
|
||||
tcb.emit_shortstring_const(def.objrealname^);
|
||||
|
||||
tcb.begin_anonymous_record('',defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
|
||||
@ -1798,8 +1765,7 @@ implementation
|
||||
argtcb:=ctai_typedconstbuilder.create([tcalo_is_lab,tcalo_make_dead_strippable,tcalo_apply_constalign]);
|
||||
|
||||
argtcb.begin_anonymous_record('',defaultpacking,min(reqalign,SizeOf(PInt)),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
arglen:=0;
|
||||
for i:=0 to High(attr.paras) do
|
||||
@ -1860,14 +1826,12 @@ implementation
|
||||
tbltcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rtti_attr_list]+tostr(count),
|
||||
defaultpacking,min(reqalign,SizeOf(PInt)),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
tbltcb.emit_ord_const(count,u16inttype);
|
||||
for i:=0 to count-1 do
|
||||
begin
|
||||
tbltcb.begin_anonymous_record(internaltypeprefixName[itp_rtti_attr_entry],defaultpacking,min(reqalign,SizeOf(PInt)),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
attr:=trtti_attribute(attr_list.rtti_attributes[i]);
|
||||
|
||||
write_rtti_reference(tbltcb,ttypesym(attr.typesym).typedef,fullrtti);
|
||||
@ -1979,14 +1943,12 @@ implementation
|
||||
tcb:=ctai_typedconstbuilder.create([tcalo_make_dead_strippable,tcalo_data_force_indirect]);
|
||||
{ use TConstPtrUInt packrecords to ensure good alignment }
|
||||
tcb.begin_anonymous_record('',defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
{ now emit the data: first the mode }
|
||||
tcb.emit_tai(Tai_const.create_32bit(longint(mode)),u32inttype);
|
||||
{ align }
|
||||
tcb.begin_anonymous_record('',defaultpacking,min(reqalign,sizeof(PInt)),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
if mode=lookup then
|
||||
begin
|
||||
o:=tenumsym(syms[0]).value; {Start with min value.}
|
||||
@ -2013,8 +1975,7 @@ implementation
|
||||
begin
|
||||
tcb.emit_ord_const(sym_count,u32inttype);
|
||||
tcb.begin_anonymous_record('',defaultpacking,min(reqalign,sizeof(PInt)),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
for i:=0 to sym_count-1 do
|
||||
begin
|
||||
tcb.emit_ord_const(tenumsym(syms[i]).value,s32inttype);
|
||||
@ -2058,13 +2019,11 @@ implementation
|
||||
tcb:=ctai_typedconstbuilder.create([tcalo_make_dead_strippable,tcalo_data_force_indirect]);
|
||||
{ begin of Tstring_to_ord }
|
||||
tcb.begin_anonymous_record('',defaultpacking,min(reqalign,sizeof(PInt)),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
tcb.emit_ord_const(syms.count,s32inttype);
|
||||
{ begin of "data" array in Tstring_to_ord }
|
||||
tcb.begin_anonymous_record('',defaultpacking,min(reqalign,sizeof(PInt)),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
for i:=0 to syms.count-1 do
|
||||
begin
|
||||
tcb.emit_ord_const(tenumsym(syms[i]).value,s32inttype);
|
||||
@ -2249,8 +2208,7 @@ implementation
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rttidef]+tstoreddef(def).rtti_mangledname(rt),
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin
|
||||
);
|
||||
write_rtti_data(tcb,def,rt);
|
||||
rttidef:=tcb.end_anonymous_record;
|
||||
|
||||
@ -614,8 +614,7 @@ implementation
|
||||
tcb.start_internal_data_builder(current_asmdata.AsmLists[al_const],sec_rodata,_class.vmt_mangledname,datatcb,classtable);
|
||||
datatcb.begin_anonymous_record('$fpc_intern_classtable_'+tostr(classtablelist.Count-1),
|
||||
packrecords,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
datatcb.emit_tai(Tai_const.Create_16bit(classtablelist.count),u16inttype);
|
||||
for i:=0 to classtablelist.Count-1 do
|
||||
begin
|
||||
@ -649,8 +648,7 @@ implementation
|
||||
plus there would be very little chance that it could actually be
|
||||
reused }
|
||||
datatcb.begin_anonymous_record('',packrecords,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
datatcb.emit_tai(Tai_const.Create_16bit(fieldcount),u16inttype);
|
||||
datatcb.emit_tai(Tai_const.Create_sym(classtable),cpointerdef.getreusable(classtabledef));
|
||||
for i:=0 to _class.symtable.SymList.Count-1 do
|
||||
@ -672,8 +670,7 @@ implementation
|
||||
end;
|
||||
}
|
||||
datatcb.begin_anonymous_record('$fpc_intern_fieldinfo_'+tostr(length(tfieldvarsym(sym).realname)),packrecords,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
datatcb.emit_tai(Tai_const.Create_sizeint(tfieldvarsym(sym).fieldoffset),sizeuinttype);
|
||||
classindex:=classtablelist.IndexOf(tfieldvarsym(sym).vardef);
|
||||
if classindex=-1 then
|
||||
@ -728,8 +725,7 @@ implementation
|
||||
begin
|
||||
tcb.start_internal_data_builder(current_asmdata.AsmLists[al_const],sec_rodata,'',datatcb,fintfvtablelabels[intfindex]);
|
||||
datatcb.begin_anonymous_record('',0,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
if assigned(AImplIntf.procdefs) then
|
||||
begin
|
||||
for i:=0 to AImplIntf.procdefs.count-1 do
|
||||
@ -847,8 +843,7 @@ implementation
|
||||
|
||||
tcb.start_internal_data_builder(current_asmdata.AsmLists[al_const],sec_rodata,_class.vmt_mangledname,datatcb,lab);
|
||||
datatcb.begin_anonymous_record('',default_settings.packrecords,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
datatcb.emit_tai(Tai_const.Create_sizeint(_class.ImplementedInterfaces.count),sizeuinttype);
|
||||
interfaceentrydef:=search_system_type('TINTERFACEENTRY').typedef;
|
||||
interfaceentrytypedef:=search_system_type('TINTERFACEENTRYTYPE').typedef;
|
||||
|
||||
@ -1082,8 +1082,7 @@ implementation
|
||||
begin
|
||||
unitinits:=ctai_typedconstbuilder.create([tcalo_make_dead_strippable,tcalo_new_section]);
|
||||
unitinits.begin_anonymous_record('',default_settings.packrecords,sizeof(pint),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
{ tablecount }
|
||||
unitinits.emit_ord_const(entries.count,aluuinttype);
|
||||
@ -1167,8 +1166,7 @@ implementation
|
||||
count:=0;
|
||||
tcb:=ctai_typedconstbuilder.create([tcalo_make_dead_strippable,tcalo_new_section]);
|
||||
tcb.begin_anonymous_record('',1,sizeof(pint),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin
|
||||
);
|
||||
placeholder:=tcb.emit_placeholder(u32inttype);
|
||||
|
||||
@ -1244,8 +1242,7 @@ implementation
|
||||
exit;
|
||||
tcb:=ctai_typedconstbuilder.create([tcalo_make_dead_strippable,tcalo_new_section]);
|
||||
tabledef:=tcb.begin_anonymous_record('',1,sizeof(pint),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
if assigned(current_module.globalsymtable) then
|
||||
current_module.globalsymtable.SymList.ForEachCall(@AddToThreadvarList,tcb);
|
||||
current_module.localsymtable.SymList.ForEachCall(@AddToThreadvarList,tcb);
|
||||
@ -1279,8 +1276,7 @@ implementation
|
||||
begin
|
||||
tcb:=ctai_typedconstbuilder.create([tcalo_make_dead_strippable,tcalo_new_section]);
|
||||
tcb.begin_anonymous_record('',default_settings.packrecords,sizeof(pint),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin
|
||||
);
|
||||
{ placeholder for the count }
|
||||
countplaceholder:=tcb.emit_placeholder(sizesinttype);
|
||||
@ -1334,8 +1330,7 @@ implementation
|
||||
s:=make_mangledname(prefix,current_module.localsymtable,'');
|
||||
tcb:=ctai_typedconstbuilder.create([tcalo_make_dead_strippable,tcalo_new_section]);
|
||||
tcb.begin_anonymous_record('',default_settings.packrecords,sizeof(pint),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign );
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
repeat
|
||||
{ optimize away unused local/static symbols }
|
||||
if (item.sym.refs>0) or (item.sym.owner.symtabletype=globalsymtable) then
|
||||
@ -1399,8 +1394,7 @@ implementation
|
||||
count:=0;
|
||||
hp:=tmodule(loaded_units.first);
|
||||
tcb.begin_anonymous_record('',default_settings.packrecords,sizeof(pint),
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
countplaceholder:=tcb.emit_placeholder(sizesinttype);
|
||||
while assigned(hp) do
|
||||
begin
|
||||
|
||||
@ -833,8 +833,7 @@ implementation
|
||||
vmtdef:=crecorddef.create_global_internal(
|
||||
vmtdefname,
|
||||
0,
|
||||
target_info.alignment.recordalignmin,
|
||||
target_info.alignment.maxCrecordalign);
|
||||
target_info.alignment.recordalignmin);
|
||||
{$ifdef llvm}
|
||||
{ in case of a class declared in the implementation section of unit
|
||||
whose method is called from an inline routine -- LLVM needs to be able
|
||||
|
||||
@ -330,8 +330,7 @@ procedure tobjcrttiwriter.gen_objc_methods(list: tasmlist; objccls: tobjectdef;
|
||||
tcb:=ctai_typedconstbuilder.create(SectFlags[target_info.system in systems_objc_nfabi]);
|
||||
tcb.begin_anonymous_record(internaltypeprefixName[itp_objc_method_list]+tostr(mcnt),
|
||||
C_alignment,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
if (abi=oa_fragile) then
|
||||
{ not used, always zero }
|
||||
@ -470,8 +469,7 @@ procedure tobjcrttiwriter.gen_objc_protocol_list(list: tasmlist; protolist: tfpo
|
||||
tcb:=ctai_typedconstbuilder.create([tcalo_is_lab,tcalo_new_section]);
|
||||
tcb.begin_anonymous_record(internaltypeprefixName[itp_objc_proto_list]+tostr(protolist.Count),
|
||||
C_alignment,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
{ protocol lists are stored in .objc_cat_cls_meth section }
|
||||
current_asmdata.getlabel(protolistsym, alt_data);
|
||||
@ -526,8 +524,7 @@ begin
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_objc_cat_methods]+tostr(items.count),
|
||||
C_alignment,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
if (abi=oa_nonfragile) then
|
||||
begin
|
||||
{ size of each entry -- always 32 bit value }
|
||||
@ -709,8 +706,7 @@ function tobjcrttiwriter_fragile.gen_objc_protocol_ext(list: TAsmList; optinstsy
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itb_objc_fr_protocol_ext],
|
||||
C_alignment,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
{ size of this structure }
|
||||
tcb.emit_ord_const(16,u32inttype);
|
||||
{ optional instance methods }
|
||||
@ -757,8 +753,7 @@ procedure tobjcrttiwriter_fragile.gen_objc_protocol(list:TAsmList; protocol: tob
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itb_objc_fr_protocol],
|
||||
C_alignment,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
{ protocol's isa - points to information about optional methods/properties }
|
||||
ConcatSymOrNil(tcb,protoext,voidpointertype);
|
||||
@ -828,8 +823,7 @@ procedure tobjcrttiwriter_fragile.gen_objc_category_sections(list:TAsmList; objc
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itb_objc_fr_category],
|
||||
C_alignment,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
tcb.queue_init(voidpointertype);
|
||||
tcb.queue_emit_asmsym(catstrsym,catstrdef);
|
||||
@ -945,8 +939,7 @@ procedure tobjcrttiwriter_fragile.gen_objc_classes_sections(list:TAsmList; objcl
|
||||
tcb:=ctai_typedconstbuilder.create([tcalo_new_section,tcalo_no_dead_strip]);
|
||||
tcb.begin_anonymous_record(internaltypeprefixName[itb_objc_fr_meta_class],
|
||||
C_alignment,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
tcb.queue_init(voidpointertype);
|
||||
tcb.queue_emit_asmsym(metaisaStrSym,metaisaStrDef);
|
||||
@ -1001,8 +994,7 @@ procedure tobjcrttiwriter_fragile.gen_objc_classes_sections(list:TAsmList; objcl
|
||||
tcb:=ctai_typedconstbuilder.create([tcalo_new_section,tcalo_no_dead_strip]);
|
||||
tcb.begin_anonymous_record(internaltypeprefixName[itb_objc_fr_class],
|
||||
C_alignment,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
{ for class declaration: the isa points to the meta-class declaration }
|
||||
tcb.emit_tai(Tai_const.Create_sym(metasym),cpointerdef.getreusable(metaDef));
|
||||
@ -1070,8 +1062,7 @@ procedure tobjcrttiwriter_fragile.gen_objc_info_sections(list: tasmlist);
|
||||
tcb:=ctai_typedconstbuilder.create([tcalo_new_section,tcalo_no_dead_strip]);
|
||||
tcb.begin_anonymous_record('',
|
||||
C_alignment,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
{ ??? (always 0 in Clang) }
|
||||
tcb.emit_tai(tai_const.Create_nil_dataptr,voidpointertype);
|
||||
{ ??? (From Clang: always 0, pointer to some selector) }
|
||||
@ -1102,8 +1093,7 @@ procedure tobjcrttiwriter_fragile.gen_objc_info_sections(list: tasmlist);
|
||||
tcb:=ctai_typedconstbuilder.create([tcalo_new_section,tcalo_no_dead_strip]);
|
||||
tcb.begin_anonymous_record('',
|
||||
C_alignment,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
{ version number = 7 (always, both for gcc and clang) }
|
||||
tcb.emit_ord_const(7,ptruinttype);
|
||||
{ sizeof(objc_module): 4 pointer-size entities }
|
||||
@ -1267,8 +1257,7 @@ procedure tobjcrttiwriter_nonfragile.gen_objc_ivars(list: tasmlist; objccls: tob
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itb_objc_nf_ivars]+tostr(vcnt),
|
||||
C_alignment,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
{ size of each entry -- always 32 bit value }
|
||||
ivtype:=search_named_unit_globaltype('OBJC','OBJC_IVAR',true).typedef;
|
||||
@ -1436,8 +1425,7 @@ procedure tobjcrttiwriter_nonfragile.gen_objc_category_sections(list:TAsmList; o
|
||||
tcb:=ctai_typedconstbuilder.create([tcalo_new_section]);
|
||||
tcb.begin_anonymous_record(internaltypeprefixName[itb_objc_nf_category],
|
||||
C_alignment,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
tcb.queue_init(voidpointertype);
|
||||
tcb.queue_emit_asmsym(catstrsym,catstrdef);
|
||||
tcb.emit_tai(Tai_const.Create_sym(clssym),voidpointertype);
|
||||
@ -1642,8 +1630,7 @@ procedure tobjcrttiwriter_nonfragile.gen_objc_class_ro_part(list: tasmlist; objc
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itb_objc_nf_class_ro_part],
|
||||
C_alignment,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
tcb.emit_ord_const(flags,u32inttype);
|
||||
tcb.emit_ord_const(start,u32inttype);
|
||||
@ -1717,15 +1704,13 @@ procedure tobjcrttiwriter_nonfragile.gen_objc_classes_sections(list:TAsmList; ob
|
||||
classdef:=isatcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itb_objc_nf_class],
|
||||
C_alignment,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
metatcb:=ctai_typedconstbuilder.create([tcalo_new_section]);
|
||||
metadef:=metatcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itb_objc_nf_meta_class],
|
||||
C_alignment,1,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
|
||||
clssym:=current_asmdata.DefineAsmSymbol(objclss.rtti_mangledname(objcclassrtti),vis,AT_DATA,classdef);
|
||||
metasym:=current_asmdata.DefineAsmSymbol(objclss.rtti_mangledname(objcmetartti),vis,AT_DATA,metadef);
|
||||
|
||||
@ -1900,7 +1900,7 @@ implementation
|
||||
Message(type_e_ordinal_expr_expected);
|
||||
consume(_OF);
|
||||
|
||||
UnionSymtable:=trecordsymtable.create('',current_settings.packrecords,current_settings.alignment.recordalignmin,current_settings.alignment.maxCrecordalign);
|
||||
UnionSymtable:=trecordsymtable.create('',current_settings.packrecords,current_settings.alignment.recordalignmin);
|
||||
UnionDef:=crecorddef.create('',unionsymtable);
|
||||
uniondef.isunion:=true;
|
||||
|
||||
|
||||
@ -1266,7 +1266,7 @@ uses
|
||||
Message(parser_e_illegal_expression)
|
||||
else
|
||||
begin
|
||||
srsymtable:=trecordsymtable.create(defname,0,1,1);
|
||||
srsymtable:=trecordsymtable.create(defname,0,1);
|
||||
basedef:=crecorddef.create(defname,srsymtable);
|
||||
include(constraintdata.flags,gcf_record);
|
||||
allowconstructor:=false;
|
||||
|
||||
@ -1088,7 +1088,7 @@ implementation
|
||||
accessed from within nested routines (start with extra dollar to prevent
|
||||
the JVM from thinking this is a nested class in the unit) }
|
||||
nestedvarsst:=trecordsymtable.create('$'+current_module.realmodulename^+'$$_fpc_nestedvars$'+pd.unique_id_str,
|
||||
current_settings.alignment.localalignmax,current_settings.alignment.localalignmin,current_settings.alignment.maxCrecordalign);
|
||||
current_settings.alignment.localalignmax,current_settings.alignment.localalignmin);
|
||||
nestedvarsdef:=crecorddef.create(nestedvarsst.name^,nestedvarsst);
|
||||
{$ifdef jvm}
|
||||
maybe_guarantee_record_typesym(nestedvarsdef,nestedvarsdef.owner);
|
||||
|
||||
@ -583,7 +583,7 @@ implementation
|
||||
if not(target_info.system in systems_managed_vm) then
|
||||
begin
|
||||
{ Add a type for virtual method tables }
|
||||
hrecst:=trecordsymtable.create('',current_settings.packrecords,current_settings.alignment.recordalignmin,current_settings.alignment.maxCrecordalign);
|
||||
hrecst:=trecordsymtable.create('',current_settings.packrecords,current_settings.alignment.recordalignmin);
|
||||
vmttype:=crecorddef.create('',hrecst);
|
||||
pvmttype:=cpointerdef.create(vmttype);
|
||||
{ can't use addtype for pvmt because the rtti of the pointed
|
||||
@ -608,13 +608,13 @@ implementation
|
||||
addtype('$vtblarray',vmtarraytype);
|
||||
end;
|
||||
{ Add a type for methodpointers }
|
||||
hrecst:=trecordsymtable.create('',1,current_settings.alignment.recordalignmin,current_settings.alignment.maxCrecordalign);
|
||||
hrecst:=trecordsymtable.create('',1,current_settings.alignment.recordalignmin);
|
||||
addfield(hrecst,cfieldvarsym.create('$proc',vs_value,voidcodepointertype,[],true));
|
||||
addfield(hrecst,cfieldvarsym.create('$self',vs_value,voidpointertype,[],true));
|
||||
methodpointertype:=crecorddef.create('',hrecst);
|
||||
addtype('$methodpointer',methodpointertype);
|
||||
{ Add a type for nested proc pointers }
|
||||
hrecst:=trecordsymtable.create('',1,current_settings.alignment.recordalignmin,current_settings.alignment.maxCrecordalign);
|
||||
hrecst:=trecordsymtable.create('',1,current_settings.alignment.recordalignmin);
|
||||
addfield(hrecst,cfieldvarsym.create('$proc',vs_value,voidcodepointertype,[],true));
|
||||
addfield(hrecst,cfieldvarsym.create('$parentfp',vs_value,parentfpvoidpointertype,[],true));
|
||||
nestedprocpointertype:=crecorddef.create('',hrecst);
|
||||
|
||||
@ -988,7 +988,7 @@ implementation
|
||||
if (n<>'') or
|
||||
not(target_info.system in systems_jvm) then
|
||||
begin
|
||||
recst:=trecordsymtable.create(n,current_settings.packrecords,current_settings.alignment.recordalignmin,current_settings.alignment.maxCrecordalign);
|
||||
recst:=trecordsymtable.create(n,current_settings.packrecords,current_settings.alignment.recordalignmin);
|
||||
{ can't use recst.realname^ instead of n, because recst.realname is
|
||||
nil in case of an empty name }
|
||||
current_structdef:=crecorddef.create(n,recst);
|
||||
@ -998,7 +998,7 @@ implementation
|
||||
{ for the JVM target records always need a name, because they are
|
||||
represented by a class }
|
||||
recst:=trecordsymtable.create(current_module.realmodulename^+'__fpc_intern_recname_'+tostr(current_module.deflist.count),
|
||||
current_settings.packrecords,current_settings.alignment.recordalignmin,current_settings.alignment.maxCrecordalign);
|
||||
current_settings.packrecords,current_settings.alignment.recordalignmin);
|
||||
current_structdef:=crecorddef.create(recst.name^,recst);
|
||||
end;
|
||||
result:=current_structdef;
|
||||
|
||||
@ -374,7 +374,7 @@ interface
|
||||
variantrecdesc : pvariantrecdesc;
|
||||
isunion : boolean;
|
||||
constructor create(const n:string; p:TSymtable);virtual;
|
||||
constructor create_global_internal(n: string; packrecords, recordalignmin, maxCrecordalign: shortint); virtual;
|
||||
constructor create_global_internal(n: string; packrecords, recordalignmin: shortint); virtual;
|
||||
function add_field_by_def(const optionalname: TIDString; def: tdef): tsym;
|
||||
procedure add_fields_from_deflist(fieldtypes: tfplist);
|
||||
constructor ppuload(ppufile:tcompilerppufile);
|
||||
@ -1387,8 +1387,7 @@ implementation
|
||||
{ set recordalinmin to sizeof(pint), so the second field gets put at
|
||||
offset = sizeof(pint) as expected }
|
||||
result:=crecorddef.create_global_internal(
|
||||
name,sizeof(pint),sizeof(pint),
|
||||
init_settings.alignment.maxCrecordalign);
|
||||
name,sizeof(pint),sizeof(pint));
|
||||
{$ifdef cpu16bitaddr}
|
||||
index_field:=result.add_field_by_def('',u16inttype);
|
||||
{$else cpu16bitaddr}
|
||||
@ -1424,8 +1423,7 @@ implementation
|
||||
for i:=low(fields) to high(fields) do
|
||||
fieldlist.add(fields[i]);
|
||||
result:=crecorddef.create_global_internal(internaltypeprefixName[prefix],packrecords,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
result.add_fields_from_deflist(fieldlist);
|
||||
fieldlist.free;
|
||||
end;
|
||||
@ -1456,8 +1454,7 @@ implementation
|
||||
exit;
|
||||
end;
|
||||
recdef:=crecorddef.create_global_internal(name,packrecords,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin);
|
||||
fields:=tfplist.create;
|
||||
fields.add(countdef);
|
||||
if count>0 then
|
||||
@ -4783,7 +4780,7 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
constructor trecorddef.create_global_internal(n: string; packrecords, recordalignmin, maxCrecordalign: shortint);
|
||||
constructor trecorddef.create_global_internal(n: string; packrecords, recordalignmin: shortint);
|
||||
var
|
||||
oldsymtablestack: tsymtablestack;
|
||||
ts: ttypesym;
|
||||
@ -4798,7 +4795,7 @@ implementation
|
||||
that can have side-effects (e.g., it removes helpers) }
|
||||
symtablestack:=nil;
|
||||
|
||||
symtable:=trecordsymtable.create(n,packrecords,recordalignmin,maxCrecordalign);
|
||||
symtable:=trecordsymtable.create(n,packrecords,recordalignmin);
|
||||
symtable.defowner:=self;
|
||||
isunion:=false;
|
||||
inherited create(n,recorddef,true);
|
||||
@ -4892,7 +4889,7 @@ implementation
|
||||
end
|
||||
else
|
||||
begin
|
||||
symtable:=trecordsymtable.create(objrealname^,0,0,0);
|
||||
symtable:=trecordsymtable.create(objrealname^,0,0);
|
||||
trecordsymtable(symtable).fieldalignment:=shortint(ppufile.getbyte);
|
||||
trecordsymtable(symtable).recordalignment:=shortint(ppufile.getbyte);
|
||||
trecordsymtable(symtable).padalignment:=shortint(ppufile.getbyte);
|
||||
@ -7082,7 +7079,7 @@ implementation
|
||||
if objecttype=odt_helper then
|
||||
owner.includeoption(sto_has_helper);
|
||||
symtable:=tObjectSymtable.create(self,n,current_settings.packrecords,
|
||||
current_settings.alignment.recordalignmin,current_settings.alignment.maxCrecordalign);
|
||||
current_settings.alignment.recordalignmin);
|
||||
{ create space for vmt !! }
|
||||
vmtentries:=TFPList.Create;
|
||||
set_parent(c);
|
||||
@ -7112,7 +7109,7 @@ implementation
|
||||
{ only used for external Objective-C classes/protocols }
|
||||
if (objextname^='') then
|
||||
stringdispose(objextname);
|
||||
symtable:=tObjectSymtable.create(self,objrealname^,0,0,0);
|
||||
symtable:=tObjectSymtable.create(self,objrealname^,0,0);
|
||||
tObjectSymtable(symtable).datasize:=ppufile.getasizeint;
|
||||
tObjectSymtable(symtable).paddingsize:=ppufile.getword;
|
||||
tObjectSymtable(symtable).fieldalignment:=shortint(ppufile.getbyte);
|
||||
|
||||
@ -108,10 +108,9 @@ interface
|
||||
recordalignment, { alignment desired when inserting this record }
|
||||
fieldalignment, { alignment current alignment used when fields are inserted }
|
||||
padalignment : shortint; { size to a multiple of which the symtable has to be rounded up }
|
||||
recordalignmin, { local equivalents of global settings, so that records can }
|
||||
maxCrecordalign: shortint; { be created with custom settings internally }
|
||||
recordalignmin: shortint; { local equivalentsof global settings, so that records can be created with custom settings internally }
|
||||
has_fields_with_mop : tmanagementoperators; { whether any of the fields has the need for a management operator (or one of the field's fields) }
|
||||
constructor create(const n:string;usealign,recordminalign,recordmaxCalign:shortint);
|
||||
constructor create(const n:string;usealign,recordminalign:shortint);
|
||||
destructor destroy;override;
|
||||
procedure ppuload(ppufile:tcompilerppufile);override;
|
||||
procedure ppuwrite(ppufile:tcompilerppufile);override;
|
||||
@ -161,14 +160,14 @@ interface
|
||||
{ object/classes. In XE5 and newer is possible to use class operator }
|
||||
{ for classes (like for Delphi .NET before) only for Delphi NEXTGEN }
|
||||
managementoperators : tmanagementoperators;
|
||||
constructor create(const n:string;usealign,recordminalign,recordmaxCalign:shortint);
|
||||
constructor create(const n:string;usealign,recordminalign:shortint);
|
||||
procedure insertunionst(unionst : trecordsymtable;offset : asizeint);
|
||||
procedure includemanagementoperator(mop:tmanagementoperator);
|
||||
end;
|
||||
|
||||
tObjectSymtable = class(tabstractrecordsymtable)
|
||||
public
|
||||
constructor create(adefowner:tdef;const n:string;usealign,recordminalign,recordmaxCalign:shortint);
|
||||
constructor create(adefowner:tdef;const n:string;usealign,recordminalign:shortint);
|
||||
function checkduplicate(var hashedid:THashedIDString;sym:TSymEntry):boolean;override;
|
||||
end;
|
||||
|
||||
@ -1170,7 +1169,7 @@ implementation
|
||||
end;
|
||||
{$endif llvm}
|
||||
|
||||
constructor tabstractrecordsymtable.create(const n:string;usealign,recordminalign,recordmaxCalign:shortint);
|
||||
constructor tabstractrecordsymtable.create(const n:string;usealign,recordminalign:shortint);
|
||||
begin
|
||||
inherited create(n);
|
||||
_datasize:=0;
|
||||
@ -1178,7 +1177,6 @@ implementation
|
||||
recordalignment:=1;
|
||||
usefieldalignment:=usealign;
|
||||
recordalignmin:=recordminalign;
|
||||
maxCrecordalign:=recordmaxCalign;
|
||||
padalignment:=1;
|
||||
{ recordalign C_alignment means C record packing, that starts
|
||||
with an alignment of 1 }
|
||||
@ -1310,7 +1308,7 @@ implementation
|
||||
begin
|
||||
case usefieldalignment of
|
||||
C_alignment:
|
||||
varalignrecord:=used_align(varalign,recordalignmin,maxCrecordalign);
|
||||
varalignrecord:=used_align(varalign,recordalignmin,current_settings.alignment.maxCrecordalign);
|
||||
mac68k_alignment:
|
||||
varalignrecord:=2;
|
||||
else
|
||||
@ -1788,7 +1786,7 @@ implementation
|
||||
Message1(sym_w_wrong_C_pack,vardef.typename);
|
||||
if varalign=0 then
|
||||
varalign:=l;
|
||||
if (globalfieldalignment<maxCrecordalign) then
|
||||
if (globalfieldalignment<current_settings.alignment.maxCrecordalign) then
|
||||
begin
|
||||
if (varalign>16) and (globalfieldalignment<32) then
|
||||
globalfieldalignment:=32
|
||||
@ -1804,7 +1802,7 @@ implementation
|
||||
else if (varalign>1) and (globalfieldalignment<2) then
|
||||
globalfieldalignment:=2;
|
||||
end;
|
||||
globalfieldalignment:=min(globalfieldalignment,maxCrecordalign);
|
||||
globalfieldalignment:=min(globalfieldalignment,current_settings.alignment.maxCrecordalign);
|
||||
end;
|
||||
mac68k_alignment:
|
||||
begin
|
||||
@ -1836,9 +1834,9 @@ implementation
|
||||
TRecordSymtable
|
||||
****************************************************************************}
|
||||
|
||||
constructor trecordsymtable.create(const n:string;usealign,recordminalign,recordmaxCalign:shortint);
|
||||
constructor trecordsymtable.create(const n:string;usealign,recordminalign:shortint);
|
||||
begin
|
||||
inherited create(n,usealign,recordminalign,recordmaxCalign);
|
||||
inherited create(n,usealign,recordminalign);
|
||||
symtabletype:=recordsymtable;
|
||||
end;
|
||||
|
||||
@ -1963,9 +1961,9 @@ implementation
|
||||
TObjectSymtable
|
||||
****************************************************************************}
|
||||
|
||||
constructor tObjectSymtable.create(adefowner:tdef;const n:string;usealign,recordminalign,recordmaxCalign:shortint);
|
||||
constructor tObjectSymtable.create(adefowner:tdef;const n:string;usealign,recordminalign:shortint);
|
||||
begin
|
||||
inherited create(n,usealign,recordminalign,recordmaxCalign);
|
||||
inherited create(n,usealign,recordminalign);
|
||||
symtabletype:=ObjectSymtable;
|
||||
defowner:=adefowner;
|
||||
end;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user