mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-16 03:59:28 +02:00
llvm: version 12.0 support
This commit is contained in:
parent
762057f46d
commit
1b06599e82
@ -330,6 +330,7 @@ implementation
|
||||
|
||||
|
||||
procedure TLLVMInstrWriter.writeparas(const paras: tfplist);
|
||||
|
||||
var
|
||||
hp: tai;
|
||||
para: pllvmcallpara;
|
||||
@ -350,9 +351,9 @@ implementation
|
||||
if para^.valueext<>lve_none then
|
||||
owner.writer.AsmWrite(llvmvalueextension2str[para^.valueext]);
|
||||
if para^.byval then
|
||||
owner.writer.AsmWrite(' byval');
|
||||
owner.writer.AsmWrite(llvmparatypeattr(' byval',para^.def,true));
|
||||
if para^.sret then
|
||||
owner.writer.AsmWrite(' sret');
|
||||
owner.writer.AsmWrite(llvmparatypeattr(' sret',para^.def,true));
|
||||
{ For byval, this means "alignment on the stack" and of the passed source data.
|
||||
For other pointer parameters, this means "alignment of the passed source data" }
|
||||
if (para^.alignment<>std_param_align) or
|
||||
|
@ -107,6 +107,10 @@ interface
|
||||
name further according to platform conventions (we already did that) }
|
||||
function llvmmangledname(const s: TSymStr): TSymStr;
|
||||
|
||||
{ convert a parameter attribute to a string. Depending on the target
|
||||
LLVM version, we may have to add the dereferenced parameter type as well }
|
||||
function llvmparatypeattr(const attr: TSymStr; paradef: tdef; strippointer: boolean): TSymStr;
|
||||
|
||||
function llvmasmsymname(const sym: TAsmSymbol): TSymStr;
|
||||
|
||||
function llvmfloatintrinsicsuffix(def: tfloatdef): TIDString;
|
||||
@ -121,7 +125,7 @@ implementation
|
||||
symtable,symsym,
|
||||
llvmsym,hlcgobj,
|
||||
defutil,blockutl,cgbase,paramgr,
|
||||
cpubase;
|
||||
llvminfo,cpubase;
|
||||
|
||||
|
||||
{******************************************************************
|
||||
@ -280,6 +284,21 @@ implementation
|
||||
result:='@'+s
|
||||
end;
|
||||
|
||||
function llvmparatypeattr(const attr: TSymStr; paradef: tdef; strippointer: boolean): TSymStr;
|
||||
begin
|
||||
result:=attr;
|
||||
if llvmflag_para_attr_type in llvmversion_properties[current_settings.llvmversion] then
|
||||
begin
|
||||
if not strippointer then
|
||||
result:=result+'('+llvmencodetypename(paradef)+')'
|
||||
else
|
||||
begin
|
||||
if paradef.typ<>pointerdef then
|
||||
internalerror(2022060310);
|
||||
result:=result+'('+llvmencodetypename(tpointerdef(paradef).pointeddef)+')'
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function llvmasmsymname(const sym: TAsmSymbol): TSymStr;
|
||||
begin
|
||||
@ -743,29 +762,30 @@ implementation
|
||||
internalerror(2015101404);
|
||||
{$endif aarch64}
|
||||
if withattributes then
|
||||
if first
|
||||
begin
|
||||
if first
|
||||
{$ifdef aarch64}
|
||||
and not is_managed_type(hp.vardef)
|
||||
and not is_managed_type(hp.vardef)
|
||||
{$endif aarch64}
|
||||
then
|
||||
encodedstr:=encodedstr+' sret noalias nocapture'
|
||||
else
|
||||
encodedstr:=encodedstr+' noalias nocapture';
|
||||
encodedstr:=encodedstr+llvmparatypeattr(' sret',hp.vardef,false)+' noalias nocapture'
|
||||
else
|
||||
encodedstr:=encodedstr+' noalias nocapture';
|
||||
end;
|
||||
end
|
||||
else if not paramanager.push_addr_param(hp.varspez,hp.vardef,proccalloption) and
|
||||
llvmbyvalparaloc(paraloc) then
|
||||
begin
|
||||
encodedstr:=encodedstr+'*';
|
||||
if withattributes then
|
||||
begin
|
||||
encodedstr:=encodedstr+'* byval';
|
||||
encodedstr:=encodedstr+llvmparatypeattr(' byval',hp.vardef,false);
|
||||
if firstloc and
|
||||
(para^.alignment<>std_param_align) then
|
||||
begin
|
||||
encodedstr:=encodedstr+' align '+tostr(para^.alignment);
|
||||
end;
|
||||
end
|
||||
else
|
||||
encodedstr:=encodedstr+'*';
|
||||
end
|
||||
else if withattributes and
|
||||
paramanager.push_addr_param(hp.varspez,hp.vardef,proccalloption) then
|
||||
|
@ -44,7 +44,9 @@ Type
|
||||
llvmver_xc_11,
|
||||
llvmver_9_0,
|
||||
llvmver_10_0,
|
||||
llvmver_11_0
|
||||
llvmver_11_0,
|
||||
llvmver_11_1,
|
||||
llvmver_12_0
|
||||
);
|
||||
|
||||
type
|
||||
@ -57,7 +59,8 @@ type
|
||||
llvmflag_null_pointer_valid_new, { new syntax for the null pointer valid attribute: null_pointer_is_valid }
|
||||
llvmflag_array_datalocation, { arrays debug info supports a dataLocation attribute to specify how to obtain the array data based on the array variable }
|
||||
llvmflag_NoDISPFlags, { no DI sub program flags, but separate fields }
|
||||
llvmflag_NoDISPFlagMainSubprogram { MainSubprogram still in DIFlags instead of DISPFlags }
|
||||
llvmflag_NoDISPFlagMainSubprogram, { MainSubprogram still in DIFlags instead of DISPFlags }
|
||||
llvmflag_para_attr_type { parameter attributes such as noalias and byval need to repeat the type }
|
||||
);
|
||||
tllvmversionflags = set of tllvmversionflag;
|
||||
|
||||
@ -72,7 +75,9 @@ Const
|
||||
'Xcode-11.0',
|
||||
'9.0',
|
||||
'10.0',
|
||||
'11.0'
|
||||
'11.0',
|
||||
'11.1',
|
||||
'12.0'
|
||||
);
|
||||
|
||||
llvm_debuginfo_metadata_format : array[tllvmversion] of byte = (
|
||||
@ -85,6 +90,8 @@ Const
|
||||
3,
|
||||
3,
|
||||
3,
|
||||
3,
|
||||
3,
|
||||
3
|
||||
);
|
||||
|
||||
@ -99,7 +106,9 @@ Const
|
||||
{ llvmver_xc_11 } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid,llvmflag_NoDISPFlagMainSubprogram],
|
||||
{ llvmver_9_0 } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid,llvmflag_constrained_fptrunc_fpext],
|
||||
{ llvmver_10_0 } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid,llvmflag_constrained_fptrunc_fpext,llvmflag_constrained_fptoi_itofp],
|
||||
{ llvmver_11_0 } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid_new,llvmflag_constrained_fptrunc_fpext,llvmflag_constrained_fptoi_itofp,llvmflag_array_datalocation]
|
||||
{ llvmver_11_0 } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid_new,llvmflag_constrained_fptrunc_fpext,llvmflag_constrained_fptoi_itofp,llvmflag_array_datalocation],
|
||||
{ llvmver_11_1 } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid_new,llvmflag_constrained_fptrunc_fpext,llvmflag_constrained_fptoi_itofp,llvmflag_array_datalocation],
|
||||
{ llvmver_12_0 } [llvmflag_memcpy_indiv_align,llvmflag_null_pointer_valid_new,llvmflag_constrained_fptrunc_fpext,llvmflag_constrained_fptoi_itofp,llvmflag_array_datalocation,llvmflag_para_attr_type]
|
||||
);
|
||||
|
||||
{ Supported optimizations, only used for information }
|
||||
|
Loading…
Reference in New Issue
Block a user